J'essaie de scinder un champ délimité par des tabulations dans bash.
Je suis conscient 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 tabulation, alors je fais ceci:
x=`head -1 my-file.txt`
echo ${x%\t*}
Mais le\t correspond à la lettre 't' et non à un onglet. Quelle est la meilleure façon de procéder?
Merci
Si votre fichier ressemble à ceci (avec une tabulation comme séparateur):
1st-field 2nd-field
vous pouvez utiliser cut
pour extraire le premier champ (opère par tabulation 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 modifiant 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 utilisant awk:
$ awk 'END {print $1}' input
10:1st-field
Solution pure bash:
#!/bin/bash
while read a b;do last=$a; done < input
echo $last
les sorties:
$ ./tab.sh
10:1st-field
Enfin, une solution utilisant sed
$ sed '$s/\(^[^\t]*\).*$/\1/' input
10:1st-field
ici, $
est l'opérateur de plage; c'est-à-dire opérer sur la dernière ligne uniquement.
Pour votre question initiale, utilisez un onglet littéral, c.-à-d.
x="1st-field 2nd-field"
echo ${x% *}
les sorties:
1st-field
Utilisez $'ANSI-C'
strings dans l’extension du paramètre:
$ x=$'abc\tdef\tghi'
$ echo "$s"
abc def ghi
$ echo ">>${x%%$'\t'*}<<"
>>abc<<
Utilisez awk.
echo $yourfield | awk '{print $1}'
ou, dans votre cas, pour le premier champ de la dernière ligne d'un fichier
tail yourfile | awk '{x=$1}END{print x}'
read field1 field2 <<< ${tabDelimitedField}
ou
read field1 field2 <<< $(command_producing_tab_delimited_output)
x=first$'\t'second
echo "${x%$'\t'*}"
VoirCITANTdans man bash