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

25
demandé sur Community 2011-07-11 22:39:35

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
44
répondu Fredrik Pihl 2011-07-11 20:34:42

utiliser $'ANSI-C' strings dans le paramètre expansion:

$ x=$'abc\tdef\tghi'
$ echo "$s"
abc     def     ghi
$ echo ">>${x%%$'\t'*}<<"
>>abc<<
10
répondu glenn jackman 2011-07-11 21:23:53

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}'
6
répondu Michael 2011-07-11 18:53:01
read field1 field2 <<< ${tabDelimitedField}

ou

read field1 field2 <<< $(command_producing_tab_delimited_output)
1
répondu user9118869 2017-12-19 15:47:10

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

voir citant dans man bash

0
répondu Luchostein 2016-08-22 23:59:53