![从 2 个不同的行中提取 2 个字段](https://linux22.com/image/60104/%E4%BB%8E%202%20%E4%B8%AA%E4%B8%8D%E5%90%8C%E7%9A%84%E8%A1%8C%E4%B8%AD%E6%8F%90%E5%8F%96%202%20%E4%B8%AA%E5%AD%97%E6%AE%B5.png)
我的文件中有以下几行
# Employee Id : ABC123,
# Employee Name: Vivek
# Employee Type: Temp Join Date: 31-jan-2014 Buz Code: 2098
# Employee Comments:
# Replacement for Jane
# Country: India
# State: Delhi
#
# Employee Id : GGG67,
# Employee Name: Kumar
# Employee Type: Temp Join Date:15-jan-2014 Buz Code: 2176
# Employee Comments:
# Country: India
# State: Delhi
# Street: Kanot
由此,我需要Employee ID
、Employee Name
和Buz Code
以表格格式表示所有员工。我尝试过awk
,但没有达到预期的结果。
有什么建议吗?
答案1
如果您展示了您已经尝试过的内容,那么它看起来就不那么像家庭作业了。也就是说,这是一个开始 - 您需要通过匹配字段名称来获取字段,但在到达下一条记录之前不要输出它们。如果您显示的所有记录之间有一个“#”,那就很方便了......
$ awk -F: -f t.awk t
ABC123, Vivek
GGG67, Kumar
将较长的 awk 脚本存储在单独的文件中会很有帮助
$ cat t.awk
/Employee Id/ {empid=$2}
/Employee Name/ {name=$2}
/#/ {print empid, name} # What happens if the next record is missing name?
END {print empid, name}
或者作为一句单行:
$ awk -F: '/Employee Id/ {empid=$2}; /Employee Name/ {name=$2}; /#/ {print empid, name}; END {print empid, name}' t
答案2
$ awk '{printf /Employee Id|Employee Name|Buz Code/? $NF" " : " "}' file
$NF
如果找到任何匹配的模式,则打印最后一个字段,例如Employee Id
or |
... else ?
print single space " "
。
按列顺序排列的结果:
ABC123, Vivek 2098 GGG67, Kumar 2176
或者
awk '/Employee Id|Employee Name|Buz Code/ {if(++i%4==0) printf RS;printf $NF FS }' file
请注意,这RS
意味着换行符\n
,并且FS
意味着单个空格(默认情况下)。
结果按行顺序:
ABC123, Vivek 2098
GGG67, Kumar 2176