次のような出力を得たいと思います。
Number Name Value
*************************************
889900 Staff 256000
990088 Staff 1048576
私の入力は次のとおりです。
%%LST:="889900";%%
Actual Service Key Value
Staff 00000001 350 256000
company 00000002 360 1572864
Total count = 2
There is together 1 report
%%LST:="990088";%%
Actual Service Key Value
Staff 00000003 350 1048576
plusmines 00000004 120 20480
different 1001 201 5120
Total count = 3
There is together 1 report
%%LST:="112233";%%
Actual Service Key Value
additional 00000005 320 1048576
payitoff 20001 73710 1048576
clubonetwothree 00000006 90006280 1048576
Total count = 3
There is together 1 report
次のようなコーディングを行いました。
IFS=$'\n'
cat > initial
cat initial | grep "%%LST:=" | awk -F'"' '{print$2}' > x1
cat initial | awk -F' ' '{if ($3 == 350) print $1,$4; else echo "0"}' > x2
rm results2
echo -e "Number Name Value\n*************************************" >> results2
paste x1 x2 | sort -n | expand -t 13 >> results2
cat results2;
rm initial
"Number"
私が望むのは、入力と"%%LST:="
名前からif "Key"
is equals =を取得し、出力で適切な値になること350
です。"Value"
"Key"
現在私のコーディングは、すべてのアイテムをインポートして情報とともに"Number"
リストに貼り付けることです。"Key"
"Value"
問題は、私のレコードにレコードがない場合はスキップし"Key" = 350
たり、空のスペースを残さないことです。最終結果全体で問題が発生しました。
自分が持っている関連情報のみをリストするには、どの機能を使用できますか"Key = 350"
?
答え1
#! /usr/bin/awk -f
BEGIN {
OFS="\t";
print "Number","Name","Value";
print "*************************************";
number="" ; name="" ; value="";
};
/^%%LST/ {
if (number != "" && name != "" && value != "") {
print number, name, value;
name=""; value="";
} ;
number=gensub(/%%LST:=?"([0-9]+)";%%/,"\\1","g")
} ;
$3 == 350 {
name=$1;
value=$4
};
END {
if (name != "") {
print number, name, value
}
}
remy.awk
たとえば、実行可能にし、chmod +x remy.awk
標準入力またはファイル名(たとえば./remy.awk remy.txt
)にデータを提供するなどの名前で保存します。
このBEGIN {}
セクションでは、出力フィールド区切り記号(OFS)をタブに設定し、出力ヘッダーを印刷して変数を初期number
化します。name
value
次に、 '%%LST'で始まる行から数字を抽出し(という変数に入れてnumber
)、最初にnumber
空でないことを確認します。すでに値がある場合は、以前の詳細を印刷します。name
と変数を記録して消去しますvalue
。
キー(フィールド3)が350の行からその行の合計を抽出しますname
。value
最後に、ブロックは空でない場合はEND {}
変数を印刷し、最終レコード(%%LST行で区切られた)がKey = = 350のレコードである場合は正しく機能します。name
これがないと、最終レコードのデータを印刷できません。
上記のサンプルデータに基づいて、出力は次のようになります。
$ ./remy.awk remy.txt
Number Name Value
*************************************
889900 Staff 256000
990088 Staff 1048576