【问题标题】:awk the column of one file from another file从另一个文件中 awk 一个文件的列
【发布时间】:2023-03-10 16:21:01
【问题描述】:

在使用 awk 时遇到了一些问题。我有两个文件,我正在尝试用第一个文件读取第二个文件的列并提取所有匹配项。

文件1:

1  
2  
3  
4  
5  

文件2:

apples  peaches 3  
apples  peaches 9  
oranges  pears 7  
apricots  figs 1

预期输出:

apples peaches 3  
apricots figs 1  
awk -F"|" '
           FNR==NR {f1[$1];next}
           ($3 in f1)
          ' file1 file2 > output.txt

【问题讨论】:

  • 你为什么有-F"|"

标签: awk


【解决方案1】:

不清楚(对我而言)file2 的格式(例如,字段之间是空格还是制表符?),或者file2 中的一行是否可以有超过 3 个(白色)分隔的分隔字符串(例如,apples black raspberries 6),因此为file2 选择分隔符需要更多详细信息。话虽如此......

  • 示例文件中没有管道('|'),因此当前代码(使用-F"|")将整行合并到awk 变量$1
  • 我们可以通过认识到我们只对file2 中的 last 字段感兴趣,从而使这更容易一些

file2添加一个条目:

$ cat file2
apples  peaches 3
apples  peaches 9
oranges  pears 7
apricots  figs 1
apples black raspberries 2

对当前awk 代码的一些小改动:

awk 'FNR==NR {f1[$1]; next} $(NF) in f1' file1 file2

这会生成:

apples  peaches 3
apricots  figs 1
apples black raspberries 2

【讨论】:

  • 太棒了,谢谢!这里的分隔符是空格,抱歉没有说清楚。仅供参考,如果在我们感兴趣的列之后有数据并且它不是最后一列,那会是什么样子/这会如何变化?
  • 这取决于后面有多少列、列分隔符以及后续列是否包含分隔符;最终结果:这取决于您以编程方式选择适当列的能力;简单的例子...一列不包含空格...$(NF-1) in f1;如果 3x 'extra' 列(不包含空格):$(NF-3) in f1
【解决方案2】:

这更像是一个旁注,我建议使用 awk,正如 markp-fuso 所解释的那样。

您可以使用join 命令:

join -11 -23 <(sort -k1,1n file1) <(sort -k3,3n file2)

上面的例子是在 shell 和 sort 命令的帮助下使用join

命令说明:

join
  -11                  # Join based on column 1 of file 1 ...
  -23                  # and column 3 in file 2
  <(sort -k1,1n file1) # sort file 1 based on column 1
  <(sort -k3,3n file2) # sort file 2 based on column 3

&lt;() 构造被称为process substitutions,由运行命令的 shell 提供。括号中的命令的输出将被视为文件,并可用作连接的参数命令。我们不需要创建中间的排序文件。

【讨论】:

    猜你喜欢
    • 2022-12-17
    • 2023-03-07
    • 2016-01-03
    • 1970-01-01
    • 2017-05-12
    • 2011-12-12
    • 1970-01-01
    • 2018-07-22
    • 2013-09-10
    相关资源
    最近更新 更多