2017-03-24 17 views
1

私は〜100個のファイルを持っていますので、ファイルの2番目の列に算術演算(たとえば合計)を行いたいと思います。 2番目のファイルの最初の行の値に、各ファイルの2番目の列のすべての行に続きます。複数の異なるファイルから列の値を追加する

私の実際のファイルには〜30,000行ありますので、行を使って手動で操作することはできません。

FILEA

1 1 
2 100 
3 1000 
4 15000 

FILEB

1 7 
2 500 
3 6000  
4 20000 

FILEC

1 4 
2 300 
3 8000  
4 70000 

出力:

1 12 
2 900 
3 15000 
4 105000 

私はこれを使用して、それを:script.sh listofnames.txtとして実行しました(すべてのファイルは同じ名前ですが、別々のディレクトリにありますので、ディレクトリ名のリストを持つファイルに$lineを付けて参照していました)。これは私に構文エラーを与え、私はそうでなければ "合計"を定義する方法を探しています。

while IFS='' read -r line || [[ -n "$line" ]]; do 
    awk '{"'$sum'"+=$3; print $1,$2,"'$sum'"}' ../$line/file.txt >> output.txt 
    echo $sum 
done < "$1" 

答えて

2
$ paste fileA fileB fileC | awk '{sum=0; for (i=2;i<=NF;i+=2) sum+=$i; print $1, sum}' 
1 12 
2 900 
3 15000 
4 105000 

またはあなたがawkの中でそれをすべてやってみたかった場合:

$ awk '{key[FNR]=$1; sum[FNR]+=$2} END{for (i=1; i<=FNR;i++) print key[i], sum[i]}' fileA fileB fileC 
1 12 
2 900 
3 15000 
4 105000 

あなたは「foo」という名前のファイルとすべてのファイルにディレクトリのリストを持っている場合は、あなたが興味を持っていますすべてのディレクトリ内の「バー」と命名され、あなたが行うことができます:あなたが実行したいcmdはawkのか、貼り付けたり、何か他のものである

IFS=$'\n' files=($(awk '{print $0 "/bar"}' foo)) 
cmd "${files[@]}" 

をそれらのファイル。見て:あなたのファイルはすべてfile.txtを命名しているし、あなたのディレクトリ名がlistofnames.txtに格納されている場合

$ cat foo 
abc 
def 
ghi klm 

$ IFS=$'\n' files=($(awk '{print $0 "/bar"}' foo)) 

$ awk 'BEGIN{ for (i=1;i<ARGC;i++) print "<" ARGV[i] ">"; exit}' "${files[@]}" 
<abc/bar> 
<def/bar> 
<ghi klm/bar> 

をそれでは、スクリプトは次のようになります。続い

IFS=$'\n' files=($(awk '{print $0 "/file.txt"}' listofnames.txt)) 

これらのいずれかによって、あなたが好む:

paste "${files[@]}" | awk '{sum=0; for (i=2;i<=NF;i+=2) sum+=$i; print $1, sum}' 

awk '{key[FNR]=$1; sum[FNR]+=$2} END{for (i=1; i<=FNR;i++) print key[i], sum[i]}' "${files[@]}" 
+0

私は100個以上のファイル(不規則な文字列名で、数字だけではない)を持っているので、最後にfileA fileB fileCを書くことは実際には実現できません。何とかその部分をスクリプト化できますか? –

+0

あなたのディレクトリに他に何もないなら、 'awk '...' file *'だけが必要です。 –

+1

@エドモートン、そうです。 – iamauser

関連する問題