2013-05-06 14 views
5

awkを使ってテキストファイルの最初の3つのフィールドを削除しようとしています。最初の3つのフィールドを削除するのは簡単です。しかし、行の残りの部分は、awkのことで台無しにされます:最初の列を削除して残りの行をそのままawkに残します

head pivot.threeb.tsv | awk 'BEGIN {IFS="\t"} {$1=$2=$3=""; print }' 

を最初の3つの列が正常に削除されます。区切り文字は、ここでは空間にタブから

を変更している私が試したものです。問題は、$ 4 $ 5 $ 6などのカラム間のタブがスペースに変換されて出力が終了することです。

+1

のawkで「IFS」という名前の変数がありません。シェルにはIFSがあり、awkにはFSがあります。 –

答えて

5

最初にEDとコメントしましたが、awkではフィールドセパレータとしてFSを使用する必要があります。 を定義していないため、 tabが出力にspaceになります。

awk 'BEGIN{FS=OFS="\t"}{$1=$2=$3="";print}' file 

これは(あなたがリードする3つのタブが表示されます)最初の3つのフィールドを削除し、「そのまま」、残りのテキストを残します。出力でも<tab>が保持されます。

awk 'BEGIN{FS=OFS="\t"}{print $4,$5,$6}' file 

は、スペース/タブの先頭には出力されません。しかし、もしあなたがループでそれをやる必要がある500列を持っているか、またはsub関数を使用するか、他のツール、例えば、カットを考慮してください。

3

あなたはその後、変更されたフィールド分離ではなく、最初の3列を削除するsedを使用したくない場合は、次の

sed -r 's/(\S+\s+){3}//' file 

バックファイルに変更を保存するには、あなたが-iオプションを使用することができます

sed -ri 's/(\S+\s+){3}//' file 
4

実はこれは、このような非常に簡単なカットコマンドで行うことができます

cut -f4- inFile 
+0

バッファされていないといいですね。 – Nakilon

0
awk '{for (i=4; i<NF; i++) printf $i " "; print $NF}' 
+0

最後の列に名前にダブルスペースが含まれていると失敗します –

+0

これは、いずれの行にも4つ未満のフィールドがある場合、期待される出力を生成できません。 (すべてを削除するのではなく最後のものを出力します)。代わりに 'awk '{for(i = 4; i <= NF; i ++)printf $ i" "; printf "\ n"} ''または、余分なロジックを追加して後続のスペースを防ぐことができます。 – Wildcard

関連する問題