que - Cómo dividir una cadena en bash delimitado por pestaña
if mayor que bash (5)
Estoy tratando de dividir un campo delimitado de pestaña en bash.
Soy consciente de esta respuesta: cómo dividir una cadena en shell y obtener el último campo
Pero eso no responde por un carácter de tabulador.
Quiero hacer obtener la parte de una cadena antes del carácter de tabulación, así que estoy haciendo esto:
x=`head -1 my-file.txt`
echo ${x%/t*}
Pero / t coincide en la letra ''t'' y no en una pestaña. ¿Cuál es la mejor manera de hacer esto?
Gracias
Si su archivo se ve algo como esto (con pestaña como separador):
1st-field 2nd-field
puede usar cut
para extraer el primer campo (opera en la pestaña por defecto):
$ cut -f1 input
1st-field
Si está usando awk
, no es necesario usar tail
para obtener la última línea, cambiando la entrada a:
1:1st-field 2nd-field
2:1st-field 2nd-field
3:1st-field 2nd-field
4:1st-field 2nd-field
5:1st-field 2nd-field
6:1st-field 2nd-field
7:1st-field 2nd-field
8:1st-field 2nd-field
9:1st-field 2nd-field
10:1st-field 2nd-field
Solución utilizando awk:
$ awk ''END {print $1}'' input
10:1st-field
Solución pura de bash:
#!/bin/bash
while read a b;do last=$a; done < input
echo $last
salidas:
$ ./tab.sh
10:1st-field
Por último, una solución utilizando sed
$ sed ''$s//(^[^/t]*/).*$//1/'' input
10:1st-field
aquí, $
es el operador de rango; es decir, operar en la última línea solamente.
Para su pregunta original, use una pestaña literal, es decir
x="1st-field 2nd-field"
echo ${x% *}
salidas:
1st-field
Use $''ANSI-C''
cadenas en la expansión del parámetro:
$ x=$''abc/tdef/tghi''
$ echo "$s"
abc def ghi
$ echo ">>${x%%$''/t''*}<<"
>>abc<<
Utilice awk.
echo $yourfield | awk ''{print $1}''
o, en su caso, para el primer campo de la última línea de un archivo
tail yourfile | awk ''{x=$1}END{print x}''
x=first$''/t''second
echo "${x%$''/t''*}"
Ver CITA en man bash
read field1 field2 <<< ${tabDelimitedField}
o
read field1 field2 <<< $(command_producing_tab_delimited_output)