【问题标题】:In linux how to join 2 files在linux中如何加入2个文件
【发布时间】:2011-05-21 17:30:32
【问题描述】:

我有 2 个文件 file_A 和 file_B。文件 file_A 包含文件名,然后是代码行。 此代码行可以包含随机类型的字符,例如空格,:等。它看起来像这样。请注意,文件中的代码行没有被 () 包围。这仅用于说明目的。

bash$ cat file_A

file_name1 (code line a)
file_name1 (code line b)
file_name2 (code line c)
file_name2 (code line d)
file_name2 (code line e)

文件file_B包含file_name以及file_A中的频率

bash$cat 文件_B

file_name1 2
file_name2 3

我希望输出为:(频率、文件名、代码行)

2 file_name1 (code line a)
2 file_name1 (code line b)
3 file_name2 (code line c)
3 file_name2 (code line d)
3 file_name2 (code line e)

bash$ join -1 1 -2 1 file_B file_A > file_C

我将 file_C 作为(我将连接字段作为第一个字段)

file_name1 2 (code line a)
file_name1 2 (code line b)
file_name2 3 (code line c)
file_name2 3 (code line d)
file_name2 3 (code line e)

如何获得第一场的频率场?

我知道通过 join 我可以使用 -o 格式并在输出中提及我想要的字段和顺序。但是我怎么说把所有都放在代码行中(可以包含任何东西,所以没有分隔符)这样

谢谢,

【问题讨论】:

  • 请编辑您的问题并使用编辑器中的 101010 按钮保留文件 sn-ps 的格式
  • 这个问题已经解决了。我可以使用 sn-p 来自:#!/bin/ksh awk ' { for (i=4; i
  • 您可以发布您的解决方案作为答案,然后接受它。这样,来自 Google 的其他用户就可以清楚地看到解决方案是什么。
  • 既然您找到了自己问题的答案,请将其发布为答案,而不是评论。这将允许人们支持它(如果他们喜欢它)或批评它(如果他们不喜欢它)。这也使您的答案对可能有类似问题的其他人更具可读性。您可以在延迟后将自己的答案标记为已接受。

标签: linux shell join sed awk


【解决方案1】:
join file_B file_A | awk '{t=$1; $1=$2; $2=t; print}' > file_C

【讨论】:

    【解决方案2】:

    注意join不支持在输出格式中指定字段范围,所以下面有点hacky,但是“代码行”中最多支持8个空格

    join -o 1.2,0,2.2,2.3,2.4,2.5,2.6,2.7,2.8,2.9 file_B file_A
    

    【讨论】:

      【解决方案3】:
      sed 's#([^ ]*) ([^ ]*) (.*)#$2 $1 $3#g'
      

      注意:也许您必须用退格符转义普通括号才能使其正常工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-12
        • 2023-04-06
        • 2017-10-19
        • 1970-01-01
        • 2018-06-11
        • 1970-01-01
        • 2018-11-07
        • 2018-02-05
        相关资源
        最近更新 更多