4

私が持っている一般的な質問は、awkにフィールドセパレーターを与え、トークンの1つを変数に格納し、次にawkに別のフィールドセパレーターを与え、トークンの1つを2番目の変数に格納し、両方を出力することは可能ですか?変数値?変数は、値自体ではなく、$n 番目のトークンへの参照を格納しているようです。

私が念頭に置いていた特定の例は、多かれ少なかれ次の形式に従います: {Animal}, {species} クラス

Cat, Felis catus MAMMAL
Dog, Canis lupus familiaris MAMMAL
Peregrine Falcon, Falco peregrinus AVIAN
...

そして、あなたはそれが次のようなものを出力したい:

Cat MAMMAL
Dog MAMMAL
Peregrine Falcon AVIAN
...

あなたが望むのは、次のフォームに適合するものです: {Animal} クラス

{} で囲まれているものは、任意の数のスペースを含めることができることを意味します。

私の最初のアイデアは、次のようなものになるというものでした。

cat test.txt | awk '{FS=","}; {animal=$1}; {FS=" "}; {class=$NF}; {print animal, class}; > animals.txt

変数「animal」にはカンマの左側にあるものを格納し、「class」にはその動物のクラス タイプを格納することを期待しています。つまり、MAMMAL などです。適用されるため、Peregrine Falcon などのように、名前にスペースが含まれるものではこれが機能しなくなります。

だからそれは次のようになります

Cat, MAMMAL
Dog, MAMMAL
Peregrine AVIAN
4

4 に答える 4

6

を使用した片道awk

awk -F, '{ n = split($2,array," "); printf "%s, %s\n", $1, array[n] }' file.txt

結果:

Cat, MAMMAL
Dog, MAMMAL
Peregrine Falcon, AVIAN
于 2012-08-21T02:27:05.930 に答える
3

split()awk スクリプト内でいつでも実行できます。フィールドを操作して、行全体を再解析することもできます。たとえば、これは質問の結果を取得します。

awk '{cl=$NF; split($0,a,", "); printf("%s, %s\n", a[1], cl)}' test.txt
于 2012-08-21T02:30:06.200 に答える
2
paste -d, <(cut -d, -f1 input.txt) <(awk '{print $NF}' input.txt)
  • cut最初の列
  • awk最後の列を取得する
  • pasteそれらを一緒に

出力:

Cat,MAMMAL
Dog,MAMMAL
Peregrine Falcon,AVIAN
于 2012-08-21T02:33:57.463 に答える