1

一部のファイルの処理に問題があります。ファイル内のすべての行に対して列カウントを実行する必要があり、列の数に応じて、各行の最後に複数の「,」を追加する必要があります。すべての行は、「,」で区切られた 36 列である必要があります。

この行は私の問題を解決しますが、自動化された方法で複数のファイルを含むフォルダーで実行するにはどうすればよいですか?

awk ' BEGIN { FS = "," } ; 
{if (NF == 32) { print $0",,,," } else if (NF==31) { print $0",,,,," }
}' <SOURCE_FILE> > <DESTINATION_FILE>

いつもR&Pをご愛顧いただき誠にありがとうございます。

4

3 に答える 3

1

答えは、あなたが私たちに言っていないOSによって異なります。UNIX では、元のファイルをそれぞれ変更すると仮定すると、次のようになります。

for file in *
do
    awk '...' "$file" > tmp$$ && mv tmp$$ "$file"
done

また、一般に、ファイル内のすべてのレコードを同じ数のフィールドを持つように取得するには、そのフィールド数を指定する必要なくこれを行うことができます (ただし、必要に応じて指定できます)。

$ cat tst.awk        
BEGIN { FS=OFS=","; ARGV[ARGC++] = ARGV[ARGC-1] }
NR==FNR { nf = (NF > nf ? NF : nf); next }
{
    tail = sprintf("%*s",nf-NF,"")
    gsub(/ /,OFS,tail)
    print $0 tail
}
$ 
$ cat file           
a,b,c
a,b
a,b,c,d,e
$ 
$ awk -f tst.awk file
a,b,c,,
a,b,,,
a,b,c,d,e
$ 
$ awk -v nf=10 -f tst.awk file
a,b,c,,,,,,,
a,b,,,,,,,,
a,b,c,d,e,,,,,
于 2013-09-26T19:27:24.573 に答える
0

これがサブフォルダーのない単一のフォルダーのみの場合は、次を使用します。

for oldfile in /path/to/files/*
do
   newfile="${oldfile}.new"
   awk '...' "${oldfile}" > "${newfile}"
done

サブディレクトリも再帰的に含めたい場合は、次のように awk+redirection を小さなシェル スクリプトに入れるのがおそらく最も簡単です。

#!/bin/bash
oldfile=$1
newfile="${oldfile}.new"
awk '...' "${oldfile}" > "${newfile}"

runawk.sh次に、 find を介してこのスクリプトを実行します (これを と呼びましょう)。

find /path/to/files/ -type f -not -name "*.new" -exec runawk.sh \{\} \;
于 2013-09-26T19:26:23.697 に答える
0

これは、Perl を使用した短いワンライナーです。

perl -i.bak -F, -alpe '$_ .= "," x (36-@F)' *
于 2013-09-26T19:27:32.353 に答える