使用 awk 合并列? (或者其他建议)

使用 awk 合并列? (或者其他建议)

我正在努力提高效率,需要一个脚本或命令解决方案。

假设我创建一个包含 2 列的文件,或创建两个包含一列的文件,以更容易的为准:

AA1 B2        ZZ1 YYY XX1
AA2 B2        ZZ2 YYY XX2
AA3 B3        ZZ3 YYY XX3
AA4 B4        ZZ4 YYY XX4
              ZZ5 YYY XX5
              ZZ6 YYY XX6
              ZZ7 YYY XX7

条目数量不均匀。现在,我想创建一个新文件(最好也有一些其他输入,尽管让我们从这里开始),它获取第一列中的每个值并将其与第二列中的每个值组合(它们总是具有不相等的行数) )并输出结果为:

AA1 B2 ZZ1 YYY XX1
AA1 B2 ZZ2 YYY XX2
[...]
AA4 B4 ZZ1 YYY XX1
AA4 B4 ZZ2 YYY XX2

因此,按顺序循环遍历第 1 列中的所有值,并将它们按顺序与第 2 列中的每个值组合。

答案1

假设您有以下文件:

$ cat file1
ZZ1 YYY XX1
ZZ2 YYY XX2
ZZ3 YYY XX3
ZZ4 YYY XX4
ZZ5 YYY XX5
ZZ6 YYY XX6
ZZ7 YYY XX7
$ cat file2
AA1 B2
AA2 B2
AA3 B3
AA4 B4

然后使用这个awk

awk 'FNR==NR{a[c++]=$0} FNR!=NR{for(i in a){print $0,a[i]}}' file1 file2
  • FNR==NR仅适用于第一个文件file1
    • a[c++]=$0填充一个名为的数组,a其内容为file1
  • FNR!=NR仅适用于第二个文件file2
    • for(i in a)循环数组a...
    • print $0,a[i]file2...并打印数组中的行和内容。

输出:

AA1 B2 ZZ1 YYY XX1
AA1 B2 ZZ2 YYY XX2
AA1 B2 ZZ3 YYY XX3
AA1 B2 ZZ4 YYY XX4
AA1 B2 ZZ5 YYY XX5
AA1 B2 ZZ6 YYY XX6
AA1 B2 ZZ7 YYY XX7
AA2 B2 ZZ1 YYY XX1
AA2 B2 ZZ2 YYY XX2
AA2 B2 ZZ3 YYY XX3
AA2 B2 ZZ4 YYY XX4
AA2 B2 ZZ5 YYY XX5
AA2 B2 ZZ6 YYY XX6
AA2 B2 ZZ7 YYY XX7
AA3 B3 ZZ1 YYY XX1
AA3 B3 ZZ2 YYY XX2
AA3 B3 ZZ3 YYY XX3
AA3 B3 ZZ4 YYY XX4
AA3 B3 ZZ5 YYY XX5
AA3 B3 ZZ6 YYY XX6
AA3 B3 ZZ7 YYY XX7
AA4 B4 ZZ1 YYY XX1
AA4 B4 ZZ2 YYY XX2
AA4 B4 ZZ3 YYY XX3
AA4 B4 ZZ4 YYY XX4
AA4 B4 ZZ5 YYY XX5
AA4 B4 ZZ6 YYY XX6
AA4 B4 ZZ7 YYY XX7

答案2

由于您的值中有空格,因此将两列放在单独的文件中会更容易。然后你可以做类似的事情:

IFS='
'
for a in $(cat file1); do
  for b in $(cat file2); do
     echo "$a $b" > file3;
  done
done

它不是最有效的,因为它必须完整地读取 file2 中的每一行,但它可以完成工作。

相关内容