Comment diviser une chaîne de caractères en bash délimité par tab
j'essaie de diviser un champ délimité par un onglet en bash.
je suis au courant de cette réponse: comment diviser une chaîne dans shell et obtenir le dernier champ
mais cela ne répond pas pour un caractère de tabulation.
je veux obtenir la partie d'une chaîne avant le caractère de l'onglet, donc je fais ceci:
x=`head -1 my-file.txt`
echo ${x%t*}
mais le t correspond sur la lettre 't' et non sur un onglet. Qu'est-ce que l' la meilleure façon de le faire?
Merci
5 réponses
si votre fichier ressemble à quelque chose comme ceci (avec tab comme séparateur):
1st-field 2nd-field
vous pouvez utiliser cut
pour extraire le premier champ (fonctionne sur tab par défaut):
$ cut -f1 input
1st-field
si vous utilisez awk
, il n'est pas nécessaire d'utiliser tail
pour obtenir la dernière ligne, en changeant l'entrée en:
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
Solution à l'aide de awk:
$ awk 'END {print }' input
10:1st-field
pur bash-solution:
#!/bin/bash
while read a b;do last=$a; done < input
echo $last
sorties:
$ ./tab.sh
10:1st-field
enfin, une solution utilisant sed
$ sed '$s/\(^[^\t]*\).*$//' input
10:1st-field
ici, $
est l'opérateur de la gamme; c.-à-d. actionner sur la dernière ligne seulement.
pour votre question initiale, utilisez un onglet littéral, i.e.
x="1st-field 2nd-field"
echo ${x% *}
sorties:
1st-field
utiliser $'ANSI-C'
strings dans le paramètre expansion:
$ x=$'abc\tdef\tghi'
$ echo "$s"
abc def ghi
$ echo ">>${x%%$'\t'*}<<"
>>abc<<
utilisez awk.
echo $yourfield | awk '{print }'
ou, dans votre cas, pour le premier champ à partir de la dernière ligne d'un fichier
tail yourfile | awk '{x=}END{print x}'
read field1 field2 <<< ${tabDelimitedField}
ou
read field1 field2 <<< $(command_producing_tab_delimited_output)
x=first$'\t'second
echo "${x%$'\t'*}"
voir citant dans man bash