2016-11-10 3 views
-1

awkには新しく、次のレコードの列を処理する方法を理解できませんでした。 必須:私は必要なの半分を取得することができる午前awkを使用して次の列の値を現在の行の値で処理する

$ cat sample.csv 
1,1,1,30,40,23,24,25,26,27,28,29,0,0,0,0,0,0,0,0 
1,2,1,35,40,33,34,35,36,37,38,39,12,13,14,15,16,17,22,36 
1,3,1,45,50,43,44,45,46,47,48,49,22,23,24,25,26,27,33,38 

は、1行目では、i線に2つの値

$ cat sample.csv | awk -F"," '{a+=$4}{b+=$5}{c+=$6}{d+=$7}{e+=$8}{f+=$9}{g+=$10}{h+=$11}{i+=$12}{j+=$13}{k+=$14}{l+=$15}{m+=$16}{n+=$17}{o+=$18}{p+=$19}END{print "Line 1 " a+b-c-d-e-f-g-h}' 

ライン1 -399

を処理することはできませんよ私は式を探すa+b-c-d-e-f-g-h - (NextRecord i+j+k+l+m+n) 最後のレコードについては、次のレコード値を0と見なすことができます。

+1

HTTP([編集ヘルプ]をご覧ください:// stackoverflow.com/editing-help)を参照してください。 – Cyrus

+1

期待される出力は何ですか? – Thor

答えて

1

私はENDブロックがあなたを台無しにしていると思います。 awkの私の限られた知識には、それはperlと漠然と似ており、少なくともperlではENDがプロセスの最後に実行されています。したがって、プロセス全体が実行されるまで実行されないコードブロックを伝えているため、1行しか取得できません。

awk -F"," '{a+=$4}{b+=$5}{c+=$6}{d+=$7}{e+=$8}{f+=$9}{g+=$10}{h+=$11}{i+=$12}{j+=$13}{k+=$14}{l+=$15}{m+=$16}{n+=$17}{o+=$18}{p+=$19} {print "Line 1 " a+b-c-d-e-f-g-h}' sample.csv 

はまた、あなたが猫にawkに、ファイルやパイプそれを必要としないことに注意してください、それは最後の引数としてファイルを受け入れます。

0

このawkコマンドを試してみてください。

awk -F, 'NR!=1{print "Line", NR-1, (l-$12-$13-$14-$15-$16-$17)} {l=($4+$5-$6-$7-$8-$9-$10-$11)} END {print "Line", NR, l} ' /tmp/sample.csv 

出力

Line 1 -192 
Line 2 -307 
Line 3 -178 

説明

awk -F, ' 
NR != 1 {      # Skip first record 
    print "Line", NR-1, \   # Print the output using the data from 
    (l-$12-$13-$14-$15-$16-$17) # the last record 
} 
{l=($4+$5-$6-$7-$8-$9-$10-$11)} # Store this for later 
END {print "Line", NR, l}  # Specific case for last record 
' /tmp/sample.csv     # filename 
+0

ありがとうジェイ!..それは私が探していた完璧な解決策です。 –