3

コンマで区切られた X 個のフィールドを持つことができるテキスト ファイルがあります。私のスクリプトでは、行ごとに読み取り、その行に入力されているフィールドの数を確認し、すべてのフィールドを表すためにその行の最後に追加する必要があるコンマの数を決定します。たとえば、ファイルは次のようになります。

Address,nbItems,item1,item2,item3,item4,item5,item6,item7    
2325988023,7,1,2,3,4,5,6,7
2327036284,5,1,2,3,4,5
2326168436,4,1,2,3,4

これになるはずです:

Address,nbItems,item1,item2,item3,item4,item5,item6,item7
2325988023,7,1,2,3,4,5,6,7
2327036284,5,1,2,3,4,5,,
2326168436,4,1,2,3,4,,,

以下のスクリプトは機能しますが、非常に効率が悪いようです。大きなファイルで苦労するのは行ごとの読み取りですか? 減速の原因はsedですか?これを行うより良い方法は?

#!/bin/bash

lineNum=0
numFields=`head -1 File.txt | egrep -o "," | wc -l`

cat File.txt | while read LINE
do
        lineNum=`expr 1 + $lineNum`
        num=`echo $LINE | egrep -o "," | wc -l`
        needed=$(( numFields - num ))
        for (( i=0 ; i < $needed ; i++ ))
        do
                sed -i "${lineNum}s/$/,/" File.txt
        done
done
4

2 に答える 2

11

このタイプのことは、通常、次のような言語で行うのが最適awkです。たとえば、次のようになります。

awk 'NR==1{n=NF}{$n=$n}1' FS=, OFS=, file
于 2013-03-01T16:08:52.860 に答える
0

これが完全なbash解決策です。

(
    IFS=","
    read hdrLine
    echo "$hdrLine"
    read -a header <<< "$hdrLine"
    numFields="${#header[@]}"

    while read -a line; do
        pad=${#line[@]}
        while (( pad < numFields )); do
            line[pad++]=
        done
        echo "${line[*]}"
    done
) < File.txt > newFile.txt
mv newFile.txt File.txt

awk解決策ははるかに優れています。これはbashデモとして見るのが一番です。

于 2013-03-01T16:08:59.893 に答える