Comment sélectionner la première colonne de la chaîne séparée par TAB?
# echo "LOAD_SETTLED LOAD_INIT 2011-01-13 03:50:01" | awk -F'\t' '{print $1}'
Ce qui précède renverra la ligne entière et pas seulement "LOAD_SETTLED" comme prévu.
Mise à jour:
J'ai besoin de changer la troisième colonne dans les valeurs séparées par tabulation. Ce qui suit ne fonctionne pas.
echo $line | awk 'BEGIN { -v var="$mycol_new" FS = "[ \t]+" } ; { print $1 $2 var $4 $5 $6 $7 $8 $9 }' >> /pdump/temp.txt
Cela fonctionne cependant comme prévu si le séparateur est une virgule au lieu d'une tabulation.
echo $line | awk -v var="$mycol_new" -F'\t' '{print $1 "," $2 "," var "," $4 "," $5 "," $6 "," $7 "," $8 "," $9 "}' >> /pdump/temp.txt
awk 'BEGIN {FS="\t"}; {print $1,FS,$2,FS,$3}' myFile.txt
pour imprimer les valeurs délimitées par des tabulations des trois premières colonnes.awk 'BEGIN {OFS="\t"}; {print $1,$2,$3}'
-v
pour la définition des variables. C'est moche à utiliserBEGIN {FS="\t"}
dans un programme en ligne , et toute contribution open source que vous essayez de faire comme celle-ci est susceptible d'être contestée. Ne faites cela que si vous écrivez un fichier programme . En outre, il est déconseillé d'utiliser à la-F
place de-v FS=
car ce dernier indique clairement que seulFS
est défini et nonOFS
. La confusion sur ce dernier point est ce qui a causé ce message en premier lieu. C'est pourquoi le «bon style» est important.OFS
variable.Réponses:
Vous devez définir la
OFS
variable (séparateur de champ de sortie) comme un onglet:echo "$line" | awk -v var="$mycol_new" -F $'\t' 'BEGIN {OFS = FS} {$3 = var; print}'
(assurez-vous de citer la
$line
variable dans l'instruction echo)la source
$
en$'\t'
est pas nécessaire. Le wiki de Greg est meilleur: "Parmi ceux-ci,$'...'
est le plus courant, et agit comme des guillemets simples sauf que les combinaisons échappées par une barre oblique inverse sont développées comme spécifié par la norme ANSI C".$'\t'
n'est pas nécessaire. awk comprend que la chaîne"\t"
est un caractère de tabulationawk -F $'\t' 'BEGIN {OFS = FS} …'
. Cela devrait êtreawk -v FS='\t' -v OFS='\t' '…'
. Cela peut sembler pédant, mais être incohérent augmente les chances qu'un contributeur ultérieur introduise un bogue parce qu'il comprend mal votre code.Assurez-vous que ce sont vraiment des onglets! Dans bash, vous pouvez insérer un onglet en utilisantC-v TAB
$ echo "LOAD_SETTLED LOAD_INIT 2011-01-13 03:50:01" | awk -F$'\t' '{print $1}' LOAD_SETTLED
la source
Vous pouvez définir le séparateur de champ:
... | awk 'BEGIN {FS="\t"}; {print $1}'
Excellente lecture:
https://docs.freebsd.org/info/gawk/gawk.info.Field_Separators.html
la source
J'utilise les variables
FS
etOFS
pour manipuler les fichiers de zone BIND délimités par des tabulations. Voici l'un de mes scripts https://gist.github.com/RichardBronosky/abe1652c2d5c78c35b92ad02bdf0d0af#file-dns_update-sh-L36-L39La viande de celui-ci est:
awk -v FS='\t' -v OFS='\t' \ -v record_type=$record_type \ -v hostname=$hostname \ -v ip_address=$ip_address ' $1==hostname && $3==record_type {$4=ip_address} {print} ' $zone_file > $temp
C'est une manière claire et facile à lire de faire cela.
la source
echo "LOAD_SETTLED LOAD_INIT 2011-01-13 03:50:01" | awk -v var="test" 'BEGIN { FS = "[ \t]+" } ; { print $1 "\t" var "\t" $3 }'
la source
Cela ne devrait-il pas fonctionner?
echo "LOAD_SETTLED LOAD_INIT 2011-01-13 03:50:01" | awk '{print $1}'
la source