unix - 如何在Unix中根据某些条件顺序组合两个文件
问题描述
我正在尝试在 Unix 中格式化文件(在本例中为 RHEL)。
文件 1
AAAAA|AAA|1582|YNYY
BBBBB|BAV|1234|NYYY
文件 1 有 1 个样本记录(行)。每条记录有 4 列。在第 4 列中,我们有 4 个状态值。
文件 2
20190103|W 2019 01
20190203|W 2019 02
20190303|W 2019 03
20190403|W 2019 04
输出必须如下:
AAAAA|1582|Y|20190103|W 2019 01
AAAAA|1582|N|20190203|W 2019 02
AAAAA|1582|Y|20190303|W 2019 03
AAAAA|1582|Y|20190403|W 2019 04
BBBBB|1234|N|20190103|W 2019 01
BBBBB|1234|Y|20190203|W 2019 02
BBBBB|1234|Y|20190303|W 2019 03
BBBBB|1234|Y|20190403|W 2019 04
我已经尝试过 AWK 和粘贴,但无法获得所需的输出。
解决方案
使用awk
awk -F'|' '{split($4,a,""); b=$1"|"$2"|"$3} { getline < "file2"; for (i in a ) print b"|"a[i]"|"$0 }' < file1`
演示:
$cat file1 file2
AAAAA|AAA|1582|YNYY
BBBBB|BAV|1234|NYYY
20190103|W 2019 01
20190203|W 2019 02
20190303|W 2019 03
20190403|W 2019 04
$awk -F'|' '{split($4,a,""); b=$1"|"$2"|"$3} { getline < "file2"; for (i in a ) print b"|"a[i]"|"$0 }' < file1
AAAAA|AAA|1582|Y|20190103|W 2019 01
AAAAA|AAA|1582|N|20190103|W 2019 01
AAAAA|AAA|1582|Y|20190103|W 2019 01
AAAAA|AAA|1582|Y|20190103|W 2019 01
BBBBB|BAV|1234|N|20190203|W 2019 02
BBBBB|BAV|1234|Y|20190203|W 2019 02
BBBBB|BAV|1234|Y|20190203|W 2019 02
BBBBB|BAV|1234|Y|20190203|W 2019 02
$
解释:
awk -F'|'
<-- 将字段分隔符设置为 |
'{split($4,a,"");
<-- 拆分第 4 个字段并存储在数组 a
b=$1"|"$2"|"$3}
<-- 将 1-2 列存储在变量 b 中
getline < "file2";
<-- 从 file2 中逐行读取输入
for (i in a ) print b"|"a[i]"|"$0
<-- 循环遍历数组a
并附加变量b
和输入记录file2
注意:当您使用getline
内部变量的值时,$0, NF, NR
会发生变化
推荐阅读
- rest - 如何使用 Flask-restplus 从 PUT 请求中获取表单数据
- gradle - 从 Eclipse 中的 gradle 项目运行单个 JUnit 测试套件的问题
- php - 根据查询字符串设置下拉值
- rest - 在沙箱中测试 PayPal Activity REST API 时的 PERMISSION_DENIED
- vba - VBA将多个参数传递给for循环内的函数
- python - 检查字符串并确定哪个按字母顺序更小
- c++ - 使用外部变量导致“无符号字符”错误 LNK2001
- php - 将 php 数组拆分为团队
- windows-10 - Hyper-V W10 (Host) Ubuntu 18.04 (Guest): Why does enhanced session mode not work?
- c++ - 高效张量乘法