web-dev-qa-db-fra.com

Comment diviser une chaîne en bash délimitée par tabulation

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

27
chaimp

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
48
Fredrik Pihl

Utilisez $'ANSI-C' strings dans l’extension du paramètre:

$ x=$'abc\tdef\tghi'
$ echo "$s"
abc     def     ghi
$ echo ">>${x%%$'\t'*}<<"
>>abc<<
13
glenn jackman

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}'
6
Michael
read field1 field2 <<< ${tabDelimitedField}

ou

read field1 field2 <<< $(command_producing_tab_delimited_output)
2
user9118869

x=first$'\t'second
echo "${x%$'\t'*}"

VoirCITANTdans man bash

0
Luchostein