2

私はawkで抱えている問題について助けや指示を求めています。

5つ以上のフィールドを持つタブ区切りファイルがあります。最初の5フィールド以外のフィールドを出力したい。

このタスクを実行するためのawkスクリプトの記述方法を教えてください。

最高、jianfeng.mao

次の親切なコメントに注意してください:

私のファイルには多くのフィールドがあります。行が異なれば、フィールドの数も異なります。1行あたりのフィールド数は標準ではありません。

4

4 に答える 4

5

タブ区切りファイルtemp.txtでは、次のようになります

field1 field2 field3 field4 field5 field6 field1 field2 field3 field4 field5 field6 field7 field1
field2 field3 field4
field5 field6 field7 field 8

あなたのアップデートに従って、私は強くお勧めしcutます:

cut -f6- temp.txt

field6を行末まで出力します。

-dは区切り文字を指定しますが、タブがデフォルトの区切り文字です。でこれを行うことができますawkが、私はcutもっと簡単だと思います。

これawkで次のようになります。

 awk '{print substr($0, index($0, $6))}' temp.txt

タブ区切りファイルのtemp.txtが次のようになっている場合

field1 field2 field3 field4 field5 field6 field1 field2 field3 field4 field5 field6 field7 field1
field2 field3 field4
field5 field6 field7 field 8

awk -F"\t" '{print $6}' temp.txt

6番目のフィールドのみを印刷します。区切り文字がタブの場合、-Fを設定しなくても機能する可能性がありますが、可能な場合はフィールド区切り文字を設定するのが好きです。

同様にそうもカットします。

cut -f6 temp.txt

私はあなたの質問がこれより少し複雑であるという予感があります、それであなたが私のコメントに答えるならば、私は私の答えを拡張することを試みることができます。

于 2011-06-10T14:39:40.177 に答える
4

私はmatchewの提案に同意しますcut:それはこの仕事に適したツールです。ただし、これがより大きなawkスクリプトの一部になる場合は、次のようにします。

awk -F "\t" '{ for (i=6; i<=NF; ++i) $(i-5) = $i; NF = NF-5; print; }
于 2011-06-10T14:56:26.253 に答える
2

perlの方法?

perl -lane 'splice @F,0,5;print "@F"'

それで、

echo 'field1 field2 field3 field4 field5 field6' | perl -lane 'splice @F,0,5;print "@F"'

を生成します

field6
于 2011-06-10T17:20:55.060 に答える
1
awk -vFS='\t' -vOFS='\t' '{
  $1=$2=$3=$4=$5=""
  print substr($0,6) # delete leading tabs
}'

awkの一部の実装(BusyBoxなど)が後者の構造でCエスケープを尊重しないため-vFS='\t'ではなく、使用します。-F'\t'

于 2012-04-19T02:20:07.943 に答える