4

AWK のフィールド区切り文字に問題があります。入力ファイルは次のようになります。

1 | すべて | | | 同義語 |
1 | ルート | | | 学名 |
2 | 細菌 | 細菌 | 学名 |
2 | モネラ | モネラ | モネラ | モネラ | 一部 |
2 | 原核生物 | 原核生物 | 一部 |
2 | 原核生物 | 原核生物 | 原核生物 | 原核生物 | 一部 |
2 | 原核生物 | 原核生物 | 一部 |
2 | 細菌 | 細菌 | ブラスト名 |

ここのフィールド区切り文字はタブ、パイプ、タブ\t|\t なので、1列目と2列目だけを印刷しようとしています

awk -F'\t|\t' '{print $1 "\t" $2}' nodes.dmp | less

目的の出力ではなく、出力は最初の列の後にパイプ文字が続きます。パイプをエスケープしようとしまし\t\|\tたが、出力は同じままです。

1 |
1 |
2 |
2 |
2 |
2 |

1 列目と 3 列目を印刷すると、元の意図した出力が得られました。

awk -F'\t|\t' '{print $1 "\t" $3}' nodes.dmp | less

しかし、なぜこれが意図したとおりに機能しないのか、私は困惑しています。

以下の perl ワンライナーが機能することは理解していますが、本当に欲しいのは awk を使用することです。

perl -aln -F"\t\|\t" -e 'print $F[0],"\t",$F[1]' nodes.dmp | less
4

3 に答える 3

1

投稿された入力から:

  1. あなたの行は、|ではなく|\t、で終わることができます
  2. 入力に ​​が含まれるケース (最初の 2 行) があり|\t|
  3. あなたの行はタブで始まります

したがって、tab-pipe-tab の FS は間違っています。なぜなら、最初は単なるタブパイプであり、2 番目の真ん中のタブは、前のフィールドを削除しても、次のフィールドのパイプタブがそのまま残り、最初のフィールドでは望ましくない先頭のタブが残ります。

実際に必要なのは、FS をタブパイプだけに設定し、各フィールドから先頭のタブを取り除くことです。

awk -F'\t|' -v OFS='\t' '{gsub(/(^|[|])\t/,""); print $1, $2}' file

そうすれば、1 から NF-1 までのすべてのフィールドをまったく同じように処理できます。

于 2013-08-13T11:56:41.580 に答える
0

cutコマンドの使用:

 cut -f1,2 -d'|' file.txt 

出力なしpipe:

 cut -f1,2 -d'|' file.txt | tr -d '|'
于 2013-08-13T12:04:23.003 に答える