【问题标题】:How to replace row with another row in linux如何在linux中用另一行替换行
【发布时间】:2018-09-04 07:22:01
【问题描述】:

我有文件 1:

A1  1  NA
A1  2  NA
A1  3  NA
A1  4  A
A1  5  G
A1  6  T
A1  7  NA
A1  8  NA
A1  9  NA
A2  1  NA
A2  2  NA
A2  3  T
A2  4  NA

还有文件 2:

A1  4  A
A1  5  B
A1  6  T
A2  3  T

我想将文件 1 中 A2 的第 4、5、6 和 3 行替换为文件 2 中的值 4、5、6 和 3

新文件3中的预期输出:-

A1  1  NA
A1  2  NA
A1  3  NA
A1  4  A
A1  5  B
A1  6  T
A1  7  NA
A1  8  NA
A1  9  NA
A2  1  NA
A2  2  NA
A2  3  T
A2  4  NA

我想在 Linux 中尝试一下。 我尝试使用谷歌搜索,但找不到更好的答案。

【问题讨论】:

  • 你试过awk吗?
  • 我试过这个 diff file2 file1
  • 两个文件中的行号是否总是连续的,要替换的值是否总是文件2中的所有值?
  • 是的,两个文件中的行号总是连续的,并且要替换的值总是文件 2 中的所有值
  • 问题不清楚,请添加上述输入将产生的预期输出,以及您所做的任何尝试

标签: linux bash shell awk replace


【解决方案1】:

另一种选择,使用 awk:

awk 'NR==FNR{a[$1,$2]=$0;next} ($1,$2) in a {$0=a[$1,$2]}1' file2 file1
A1  1  NA
A1  2  NA
A1  3  NA
A1  4  A
A1  5  B
A1  6  T
A1  7  NA
A1  8  NA
A1  9  NA
A2  1  NA
A2  2  NA
A2  3  T
A2  4  NA

【讨论】:

  • 我也试过了 cat file2 file1 | awk '!seen[$1,$2]++' |排序 -k 1V,1 -k 2n,2 但没有结果
  • @RKG:这有点奇怪,在我的系统上,两个命令给出相同的输出
  • 实际上,我的文件行是 30 万行和 3 列文件 1 和 50K 行和 3 列文件 2,因此花费的时间很少。我希望它能给我结果
【解决方案2】:

使用连接:

join -a 2 file2 file1 | cut -d ' ' -f -2

其中 file1 是原始文件,file2 是带有替换字段的文件。


编辑:问题的要求自发布以来已更改;它最初要求加入两个文件,每个文件有两列。对于新格式,此 awk 脚本有效:

cat file1 file2 | awk '
  BEGIN { OFS = "  " }
  { rows[$1 OFS $2] = $3 }
  END { for (r in rows) print(r, rows[r]) }
' | sort -V >file3

使用问题中指定的文件输出:

$ cat file3
A1  1  NA
A1  2  NA
A1  3  NA
A1  4  A
A1  5  B
A1  6  T
A1  7  NA
A1  8  NA
A1  9  NA
A2  1  NA
A2  2  NA
A2  3  T
A2  4  NA

【讨论】:

  • 不,我只想用文件 2 中的匹配行值替换文件 1 中的值
  • 我刚刚编辑了它的输出示例。它不适合您尝试做的事情吗?
  • 不,这并没有给我结果,它只是连接了文件
  • 现在输入数据被定义为在数字前面有另一个字段,上面的join 命令不再起作用。一种方法是用例如“+”替换第一个分隔空间对,然后使用该命令,但我不知道如何在没有临时文件的情况下执行此操作。
  • 我同意,join 不太适合新问题。我使用 awk 解决方案编辑了我的答案,它应该更具可扩展性,因为微小的更改允许您配置输出分隔符或要加入的列数。在我看来,它不像 join 那样优雅。
【解决方案3】:

如果您使用结构将数据插入文件中,则可以使用相同的结构通过循环检索第n个条目并分别替换它!

否则,如果您手动插入数据,则只需遍历文件 (n-1) 个 '\n' 并检索以下数据!

【讨论】:

    猜你喜欢
    • 2016-06-10
    • 2011-12-01
    • 1970-01-01
    • 2015-10-07
    • 2018-08-29
    • 2011-12-18
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多