2012-03-20 3 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 –

+0

@ php-coder '{$ 5 = $ 5}'は少なくとも5つのフィールドがあることを保証し、すべてのフィールドをOFSで結合することによってAwkが '$ 0'を再計算するよう強制します。 '1'はボディがない常に真の条件なので、ボディのデフォルトは' {print} 'で、 '$ 0'を出力します。 – ephemient

2

a,b,c,d 
d,e,f 

を変換することができます:

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

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

証明:awk

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

証拠だと思います。 –

4

例:

$ 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 

私はいつも仕事のための適切なツールではありません、それはsedをはるかに単純明快

+0

これ以上開始する必要がある場合は、5つのフィールドを切り捨てます。時には大丈夫、ときどき、それが何のために使われているかにもよる。 – ephemient

関連する問題