【问题标题】:Matching pattern present in one column should replace with the entry of second file [closed]一列中存在的匹配模式应替换为第二个文件的条目[关闭]
【发布时间】:2021-02-16 05:19:11
【问题描述】:

我有两个文件 文件1.txt

ID  AB  AC  AD  AE
L   5   6   7   5
M   4   5   6   4
O   2   4   6   8
P   7   9   6   5
Q   7   8   6   5

file2.txt

AB  BB
AC  HG
AD  ZH
AE  BE

result_file.txt

ID  BB  HG  ZH  BE
L   5   6   7   5
M   4   5   6   4
O   2   4   6   8
P   7   9   6   5
Q   7   8   6   5

我怎样才能得到这个输出。我知道 sed 可用于替换,但如何将它应用于多个条目。

【问题讨论】:

  • 请以代码的形式添加您的努力,这是非常鼓励的,谢谢。
  • 让您开始尝试在 bash replace multiple patterns 上进行谷歌搜索,然后查看(冗长的)点击列表以找到符合您要求的想法

标签: bash awk sed replace


【解决方案1】:

这可能对你有用(GNU sed):

$ sed -E 's/(\S+)\s+(\S+).*/1s#\1#\2#/' file2 | sed -f - file1

使用file2创建了一个sed脚本,用于转换file1的头部。

【讨论】:

  • 你能解释一下整个命令吗?
  • @Mendel 第一次 sed 调用获取 file2 的每一行并将其转换为 sed 命令,例如file2 的第一行是 AB BB 变为 1s#AB#BB# 这作为 sed 脚本传递给第二个 sed 调用,它将第一行从 ID AB AC AD AE 更改为 ID BB AC AD AE 等。
【解决方案2】:

使用 awk:

awk 'NR==FNR { arr[$1]=$2 } NR != FNR && FNR == 1 { printf "%s  ","ID";for (i=2;i<=NF;i++) { printf "%s  ",arr[$i] } } NR != FNR && FNR != 1 { printf "\n%s",$0 }' file2.txt file1.txt

处理 file2.txt (NR==FNR) 并创建一个数组 (arr),以第一列和第二列的值作为索引。然后处理第二个文件 (NR != FNR) 对于第一行,循环遍历从 2 开始的空格分隔字段,并打印与数组 arr 中的索引对应的值。然后按原样打印这些行。

【讨论】:

    猜你喜欢
    • 2020-05-13
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    • 2013-04-03
    • 2015-08-08
    • 2021-10-16
    • 1970-01-01
    相关资源
    最近更新 更多