首页 > 解决方案 > 如何在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 和粘贴,但无法获得所需的输出。

标签: unixrhel

解决方案


使用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会发生变化


推荐阅读