2013-01-19 55 views

回答

12

如果所有行都具有相同數量的字段,則可以執行此操作,否則,可以使用awk。

cut -d, -f1-6 # assuming 10 fields 

將打印出的第一個6個字段,如果你想控制輸出seperater使用--output分隔符=串

awk -F , -v OFS=, '{ for (i=1;i<=NF-4;i++){ printf $i, }; printf "\n"}' 

遍歷領域多達日打印領域的數量-4他們出去了。

+0

在awk行中,我想你要printf $我不打印$ i,對不對?錯字可能?和'打印$我',將不起作用,您可能想要';'另一個錯字? – Kent

+0

@ kent yeah意思是printf $我,你不需要有;如果只有一個命令。 – peteches

+0

你是對的,但你有「逗號」.. :) – Kent

6

如果知道列數,則可以使用cut。例如,如果你的文件有9列,而逗號是您的分隔符:

cut -d',' -f -5 

然而,這種假設在您的CSV文件不包含任何逗號數據。 cut也會將引號內的逗號解釋爲分隔符。

1

AWK一行代碼:

awk -F, '{for(i=0;++i<=NF-5;)printf $i", ";print $(NF-4)}' file.csv 

在切割是用awk的優勢,你不必指望有多少列你有,你要多少列保持。因爲你想要的是刪除最後4列。

看到測試:

kent$ seq 40|xargs -n10|sed 's/ /, /g'   
1, 2, 3, 4, 5, 6, 7, 8, 9, 10 
11, 12, 13, 14, 15, 16, 17, 18, 19, 20 
21, 22, 23, 24, 25, 26, 27, 28, 29, 30 
31, 32, 33, 34, 35, 36, 37, 38, 39, 40 

kent$ seq 40|xargs -n10|sed 's/ /, /g' |awk -F, '{for(i=0;++i<=NF-5;)printf $i", ";print $(NF-4)}' 
1, 2, 3, 4, 5, 6 
11, 12, 13, 14, 15, 16 
21, 22, 23, 24, 25, 26 
31, 32, 33, 34, 35, 36 
1

這可能會爲你工作(GNU SED):

sed -r 's/(,[^,]*){4}$//' file 
+0

在我看來,這裏是最好的答案! –

10
cat data.csv | rev | cut -d, -f-5 | rev 

rev反轉線,所以它並不重要,如果所有的行具有相同數量的列,它將始終刪除最後4個。這僅適用於最後4列本身不包含任何逗號的情況。

+2

在我看來,這是一個非常不錯的解決方案,+1使用rev(我不知道它存在) – skd

1

在被黑方式

awk -F, 'OFS=","{for(i=NF; i>=NF-4; --i) {$i=""}}{gsub(",,,,,","",$0);print $0}' temp.txt 
3
awk -F, '{NF-=4; OFS=","; print}' file.csv 

或替代地

awk -F, -vOFS=, '{NF-=4;print}' file.csv 

將從每行刪除最後一個4列這AWK溶液。

+0

好的方法來刪除額外的列,但對我來說,這取代了列之間的逗號與輸出中的空格。有一種簡單的方法可以避免這種情況,並將它們保留爲逗號? –

+0

你可以用awk -F加上你的分​​隔符,'{NF- = 4; OFS = 「」;打印}' –

+0

偉大的,這對我有用。也可以在'BEGIN'塊或者''-v'命令行參數中設置'OFS',比如'awk -F,-vOFS =,...' –