2016-03-24 13 views
2

と相互作用Iはリストfarm.txt有する:Awkの、システム()関数、シェル

cow 
chicken 
horse 
pig 

を有するI BASH変数$ヘッダに割り当てられたカンマ区切り値の次の文字列、:

私が使用

cow,hay,2,12:00 
cow,grain,3,12:00 
chicken,corn,1000,11:00 
pig,slop,76,04:00 
horse,apple,1,23:00 
... 

animal,food_type,food_amount,feed_time 

は最後に、私はこれらの動物のそれぞれのケアについてのデータを含むファイルcare.csvを持っていますAWKを使用してfarm.txt内の各単語を取得し、それを使用して "[animal] _care.csv"という形式の新しい.csvファイルを作成します。

awk -F '\r' 'NR > 1 { system("touch " $1"_care.csv") }' farm.txt 

このスクリプトはこれまでのところ動作します。私は私が期待した出力を得る:私は今、何をしたいか

cow_care.csv 
chicken_care.csv 
horse_care.csv 
pig_care.csv 

はcare.csvを通じてサイクルに再びAWKを使用して、適切な[動物] _care.csvファイルに各行を割り当てることです。ここに私が試みているものがあります:

awk -F ',' '{ system("echo " $0 " >> " $1 "_stale.csv") }' care.csv 

しかし、これは動作していません。最後に、文字列$ headerを各[anima] _care.csvファイルの先頭に入れたいと思います。

私は困惑しています。誰かが正しい方向に向かうことができますか?ありがとう。

答えて

2

あなたはできるだけでredirect the output of print to a file

awk -F, '{file=$1"_stale.csv"; print $0 >> file; close(file)}' care.csv 

system()が、ここで必要とされていません。ファイルを閉じることを忘れないでください。そうしないと、care.csvの行数に応じて、「オープンファイル記述子が多すぎます」という結果に終わることがあります。

あなたは、同様に使用するヘッダを印刷する場合:

awk -F, 'NR==1{header=$0; next} # Save the header on the first line 
    {file=$1"_stale.csv"; print header > file; print $0 >> file; close(file)} 
' care.csv 

これはヘッダがcare.csvの上にあることを前提としています。あなたはコマンドラインの使用を経由してヘッダを渡したい場合は、次のファイルを単純に変更ソートされていない場合

ファイルを想定し
awk -F, -v header="$header" \ 
    '{file=$1"_stale.csv"; print header > file; print $0 >> file; close(file)}' care.csv 
+0

解決策は、ヘッダーの追加を除いて、広告されたとおりに動作します。どちらの方法でも、ヘッダーをファイルの先頭に挿入することはできません。 – OnlyDean

+0

これは、各行の前にヘッダを何度も印刷すると思います。 – karakfa

+0

@ user3285817申し訳ありませんが、 '='が見つかりませんでした。 'NR = 1'ではなく、' NR == 1 'でなければなりません。今それは私のために働く – hek2mgl

2

あなたは、ヘッダーを追加したい場合は、動物の名前

$ awk -F, -v h="$header" 'p!=$1{print h > $1"_stale.csv"; p=$1} 
           {print > $1"_stale.csv"}' care.csv 

$ tail *stale.csv 

==> chicken_stale.csv <== 
animal,food_type,food_amount,feed_time 
chicken,corn,1000,11:00 

==> cow_stale.csv <== 
animal,food_type,food_amount,feed_time 
cow,hay,2,12:00 
cow,grain,3,12:00 

==> horse_stale.csv <== 
animal,food_type,food_amount,feed_time 
horse,apple,1,23:00 

==> pig_stale.csv <== 
animal,food_type,food_amount,feed_time 
pig,slop,76,04:00 

を順にソートされます最初のブロックを

!($1 in a){print h > $1"_stale.csv"; a[$1]} 
+0

あなたが最初にcare.csvを並べ替えることを確認してください! –

+0

そのための治療法があり、アップデートとして掲示されています。 – karakfa

関連する問題