2012-03-20 75 views

回答

6

容易在awk中:

awk -F, -vOFS=, '{$5=$5}1' 

不要太用力在擊:

IFS=, 
while read -a F; do 
    for ((i=0; i<5; i++)); do 
     F[i]=${F[i]} 
    done 
    echo "${F[*]}" 
done 
+0

你能解釋一下這個awk-oneliner是如何工作的嗎? TIA – 2012-03-20 19:28:52

+0

@ php-coder'{$ 5 = $ 5}'確保至少有5個字段,並強制Awk通過將'OFS'加入所有字段來重新計算'$ 0'。 '1'是一個總是正確的條件,沒有主體,所以主體默認爲'{print}',它輸出'$ 0'。 – ephemient 2012-03-20 19:50:56

2

我發現GNU sed的解決方案:

sed -r 's/^([^,]*)(,|)([^,]*)(,|)([^,]*)(,|)([^,]*)(,|)$/\1,\3,\5,\7,/' 

#    |   |   |   |  ^^^^ 
#    |   |   |   |   | | | | 
#    |__________|__________|__________|__________| | | | 
#      |__________|__________|_____________| | | 
#         |__________|________________| | 
#            |___________________| 

證明:

echo -e "a,b,c,d\nd,e,f\nx" | sed -r 's/^([^,]*)(,|)([^,]*)(,|)([^,]*)(,|)([^,]*)(,|)$/\1,\3,\5,\7,/' 
a,b,c,d, 
d,e,f,, 
x,,,, 
+1

證明,戰略經濟對話並不總是對工作的工具。 – 2012-03-21 13:16:31

4

例與awk

$ awk -F, '{printf("%s,%s,%s,%s,%s\n",$1,$2,$3,$4,$5)}' example.txt 
a,b,c,d, 
d,e,f,, 

$ awk -F, -v OFS=, '{print $1,$2,$3,$4,$5}' example.txt 
0

這是我非常喜歡的另一種方法是這樣的:

gawk '{print $0 ",,,,,"}' a | cut -d \, -f 1-5 

我覺得這是更簡單明瞭

+0

如果還有更多的話,它也會在5個字段處截斷。有時可以,有時不可以,這取決於它的用途。 – ephemient 2012-03-22 01:18:37