私はawkで抱えている問題について助けや指示を求めています。
5つ以上のフィールドを持つタブ区切りファイルがあります。最初の5フィールド以外のフィールドを出力したい。
このタスクを実行するためのawkスクリプトの記述方法を教えてください。
最高、jianfeng.mao
次の親切なコメントに注意してください:
私のファイルには多くのフィールドがあります。行が異なれば、フィールドの数も異なります。1行あたりのフィールド数は標準ではありません。
タブ区切りファイル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
私はあなたの質問がこれより少し複雑であるという予感があります、それであなたが私のコメントに答えるならば、私は私の答えを拡張することを試みることができます。
私はmatchewの提案に同意しますcut
:それはこの仕事に適したツールです。ただし、これがより大きなawk
スクリプトの一部になる場合は、次のようにします。
awk -F "\t" '{ for (i=6; i<=NF; ++i) $(i-5) = $i; NF = NF-5; print; }
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
awk -vFS='\t' -vOFS='\t' '{
$1=$2=$3=$4=$5=""
print substr($0,6) # delete leading tabs
}'
awkの一部の実装(BusyBoxなど)が後者の構造でCエスケープを尊重しないため-vFS='\t'
ではなく、使用します。-F'\t'