2017-07-12 8 views
2

awkスクリプトの出力を既存のファイルに新しいフィールドとして毎回表示する方法はありますか?Awk:既存ファイルの新しいフィールドに出力を追加

こんにちは! 私はawkで非常に新しいです(私の用語は正しくないかもしれません、それについてはごめんなさい!)、私は数百のファイルを同じファイルに、異なるフィールドで操作するスクリプトの出力を印刷しようとしています。

例えば、私のデータファイルは、この構造を持っている:

#File1 
1 
Values, 2, Hanna 
20 
15 
Values, 2, Josh 
30 
56 
Values, 2, Anna 
50 
70 

#File2 
2 
Values, 2, Hanna 
45 
60 
Values, 2, Josh 
98 
63 
Values, 2, Anna 
10 
56 

私は、同じ名前が、異なる値を使用して、番号の月で分割され、これらのファイルのいくつかを持っています。私のスクリプトで

#Hanna 
20 45 
15 60 

#Josh 
30 98 
56 63 

#Anna 
50 10 
70 56 

、私は言葉「値」を検索し、印刷に記録するかを決定:私はそうのように、月によって人物の名前で命名されたファイル、およびフィールドの値をしたいです(「値」の後の数字に基づいて)。これは正常に動作します。次に、これらの値を印刷します。

Print $0 > name#このvarible名前は私が= $ 3このは正しく「ハンナ」、「ジョシュ」と "という3つのファイルが作成されます

正しい行であることが保存されている:それはコマンドを使用して、一つのファイルのために正常に動作しますアンナ "、それらの値と。しかし、私はすべての自分のデータファイルに対してスクリプトを実行し、それらを新しいフィールドの1つの "Hanna"ファイルなどに追加したいと思います。

それでは、私が探していることは「月に対応するフィールドにレコードを印刷する」

のように読み出す、print $0 > $month nameのようなもので、私は解決策を見つけることを試みたが、ほとんどのソリューションは、単に一時的なペーストのいずれかファイルをまとめたり、既存のものの後ろに値を追加したりします(すべてがフィールド1になるようにします)。私は一時ファイルを避け、別のフィールドに(私は一種の行列構造を得るために)持っていたいです。

ありがとうございます!

答えて

0

私はすべての順列と組み合わせをチェックしておらず、自分の投稿のみを考慮していますが、次のことを試してみてください。また、あなたの出力Joshコラムも一貫していません(または同じ条件があるかどうかを私たちに知らせてください)。それがどうなるか教えてください。

awk 'FNR==NR{if($0 ~ /^Values/){Q=$NF;B[$NF]=$NF;i="";next};A[Q,++i]=$0;next} /^Values/{V=$NF;print "#"B[V];i="";next} B[V]{print A[V,++i],$0}' file1 file2 

EDIT:すぎる溶液の非オンライナーフォームを追加します。

awk 'FNR==NR{ 
       if($0 ~ /^Values/){ 
             Q=$NF; 
             B[$NF]=$NF; 
             i=""; 
             next 
            }; 
       A[Q,++i]=$0; 
       next 
      } 
    /^Values/{ 
       V=$NF; 
       print "#"B[V]; 
       i=""; 
       next 
       } 
    B[V]{ 
       print A[V,++i],$0 
     } 
    ' file1 file2 

EDIT2:あまりにも今同じの説明を追加します。

awk 'FNR==NR{          ###Checking condition FNR==NR where this condition will be TRUE only when first file named file1 is being read. FNR and NR both indicate number of lines in a Input_file, only difference between them is FNR value will be RESET whenever there is next Input_file is being read and NR value will be keep on incresing till all the Input_files are read. 
       if($0 ~ /^Values/){    ###Checking here if any line starts from string Values if yes then perform following operations. 
             Q=$NF;  ###Creating a variable named Q whose value is the last field of the line. 
             B[$NF]=$NF;###Creating an array named B whose index is $NF(last field of the line) and value is same too. 
             i="";  ###Making variable i value to NULL now. 
             next  ###using next here, it is built-in keyword for awk and it will skip all further statements now. 
            }; 
       A[Q,++i]=$0;      ###Creating an array named A whose index is Q and variable i with increasing value with 1 to it, each time it comes on this statement. 
       next        ###Using next will skip all further statements now. 
      } 
    /^Values/{         ###All statements from here will be executed when second file named file2 is being read. So I am checking here if a line starts from string Values then do following. 
       V=$NF;        ###create variable V whose value is $NF of current line. 
       print "#"B[V];      ###printing the string # then value of array B whose index is variable V. 
       i="";        ###Nullifying the variable i value here. 
       next        ###next will sip all the further statements now. 
       } 
    B[V]{           ###Checking here if array B with index V is having a value in it, then perform following on it too. 
       print A[V,++i],$0     ###printing the value of array A whose index is variable V and variable i increasing value with 1 and current line. 
     } 
    ' file1 file2         ###Mentioning the Input_files here named file1 and file2. 
+0

ありがとうございます!私は上記のJosh-typoを修正しました。 しかし、私はawkにとって非常に新しいので、私はあなたのソリューションを実装する方法を本当に理解していませんか?私はそれを構文BEGIN {....}を持つtxtファイルに書いていますし、awk -f script.txt data1.dataを端末から書き出して実行しています。自分のコードを自分のtxtファイルまたは端末に書き込むべきですか?申し訳ありませんが、もっと分かりませんが、私はこれが '>'と '$'の単純な組み合わせで解決できると思いました。Pあなたを大変困らせて申し訳ありません。 –

+0

クール、私はこの1つの説明を追加し、学習、共有を続けて:)編集:あなたも端末でそれを実行することができます、あなたはBASHスクリプトを作成し、それから実行することもできますし、それに少し変更を加えることで、それがあなたのためにどうなるかを教えてください。 – RavinderSingh13

+0

うわー、これは(種類の)作品です! (そして、残りのコードは冗長なhahaにしました)。本当にありがとう!しかし、私はこれが少し不明であることを今見ている。名前によれば、私は3つの異なるファイルに出力を保存したいと思います。したがって、 "Anna"というタイトルのファイルには、Annaの4つの数字、Joshの数字などを含むファイル "Josh"などが含まれているはずです。私の元のコードでは、シーケンスの最後に[>名前]がありましたが、今ではすべての値をAnnaに保存します。 –

関連する問題