我想要获得如下输出:
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