2014-01-07 94 views
1

我的CSV文件有12列(製表符分隔),我想打印出前11列。我想出了這個awk代碼,但它破壞了格式(不再有製表符分隔符)。我需要一些幫助來保持格式,而只打印出前11列。幫助表示讚賞。awk:打印前11列(不包括最後一列)

awk '{for(i=1;i<12;i++)printf "%s",$i OFS}' 
+1

你試圖'cut'呢? – Rubens

+0

'awk'{for(i = 1; i <12; i ++)printf「%s \ t」,$ i OFS}''? – suspectus

+0

是的。削減可能更適合這個目的。這就是說你需要設置OFS到你想要的分隔符(即標籤)。 –

回答

2

像這樣的東西應該做你想做的事情,假設你想在每個輸入字段之間使用單個選項卡。

awk -vOFS='\t' '{NF=NF-1}1' $file 

-vOFS='\t'設置OFS到製表符。

NF=NF-1告訴awk該行有一個比它開始的字段更少的字段,並導致它重新計算$0的值。

1模式有默認打印,所以使用任何真值打印$0

嘗試使用awk '{NF=NF-1}1' OFS='\t' $file代替或不符合awk 'BEGIN{OFS="\t"} {NF=NF-1}1' $file以避免-v

+0

awk:invalid -v選項 – TonyGW

+1

這是什麼awk? –

+0

@TonyGW,你的系統是否有:'gawk','nawk'或'/ usr/xpg4/bin/awk'? –

1

一些awk variaton

awk 'NF-=1' OFS=\\t $file 
awk '{NF-=1}1' OFS=\\t $file 
awk '{NF-=1}1' OFS="\t" $file 
awk -v OFS="\t" '{NF-=1}1' $file 
+0

第一個將會失敗(對於負NF,awk錯誤,至少在gawk 3.1.5時),並且會完全刪除只有一個字段的行而不是根據需要打印空行)。 –

0

,如果你有紅寶石您的系統上

# ruby -ne 'puts $_.split("\t")[0..10].join("\t")' file