首页 > 解决方案 > 搜索键值对并将值附加到 unix 中的其他键

问题描述

我需要搜索一个键并将值附加到 Unix 文件中的每个键:值对

输入文件数据:

1A:trans_ref_id|10:account_no|20:cust_name|30:trans_amt|40:addr
1A:trans_ref_id|10A:ccard_no|20:cust_name|30:trans_amt|40:addr

我想要的输出:

account_no|1A:trans_ref_id
account_no|10:account_no
account_no|20:cust_name
account_no|30:trans_amt
account_no|40:addr
ccard_no|1A:trans_ref_id
ccard_no|10A:ccard_no
ccard_no|20:cust_name
ccard_no|30:trans_amt
ccard_no|40:addr

基本上,我需要每个键的值1010A附加到每个键:值对并拆分为新行。需要明确的是,这并不总是第二个字段。

我是 sed、awk 和 perl 的新手。我开始使用 awk 提取值:

awk -v FS="|" -v key="59" '$2 == key {print $2}' target.txt

标签: perlawksed

解决方案


# Looks for 10 or 10A
perl -F'\|' -lane'my ($id) = map /^10A?:(.*)/s, @F; print "$id|$_" for @F'
# Looks for 10 or 10<non-digit><maybe more>
perl -F'\|' -lane'my ($id) = map /^10(?:\D[^:]*)?:(.*)/s, @F; print "$id|$_" for @F'
  • -n为每一行输入执行程序。
  • -l在读取时删除 LF 并在打印时添加它。
  • -a|将(由 指定-F)上的行拆分为@F.
  • 第一条语句提取:id 为 10 或 10-plus-something 的字段中的内容。
  • 第二条语句为每个字段打印一行。

指定要处理的文件到 Perl 单行


推荐阅读