在“连接”中保留字段顺序

在“连接”中保留字段顺序

假设我有两个这样的文件:

1   a   one ...
2   b   two ...
3   c   three   ...
4   d   four    ...
5   e   five    ...
6   f   six ...

a
c
f

有没有办法,不知道文件 1 中的列数(或者不必重复每个字段),我可以使用 join 来获取匹配行

1   a   one ...
3   c   three   ...
6   f   six ...

我试过了

join -1 2 -o 1.0 file1 file2

就像你写的$0那样获取所有字段awk,但我显然得到了invalid field number

答案1

您可以选择按顺序打印哪些字段或按默认顺序打印所有字段。但您无法打印“其余字段”。

man join

-o FORMAT
       obey FORMAT while constructing output line
[...]
Any FIELD is a field number counted from 1. FORMAT is one or
more  comma or blank separated specifications, each being
'FILENUM.FIELD' or '0'.

你可以使用 awk:

awk -v regex="$(head -c -1 file2 | tr '\n' '|')" '$2 ~ regex' file1
  • 删除 file2 的最后一个换行符并用“|”替换换行符,正则表达式将是a|c|f
  • 将 file1 的第二个字段与该正则表达式匹配

或者使用 Sundeep 的 awk 解决方案,特别是如果 file2 包含特殊字符。

答案2

在你的情况下,你可以只交换前两个字段:

| awk '{swap=$1;$1=$2;$2=swap;print $0}' 

相关内容