【问题标题】:How to compare two files that are partially matching and replace the parts that are matching in bash?如何比较两个部分匹配的文件并替换bash中匹配的部分?
【发布时间】:2015-09-30 21:38:57
【问题描述】:

我有 2 个 dat 文件,FILE1FILE2。第一个有(例如)1000 行,第二个有 100 行。两个文件中的行具有相同的格式,即 5 个数字,以空格分隔。 FILE2 值的行部分匹配 FILE1 中的行。比如FILE2中有一行是:

1 2 3 4 5

FILE1中有一行是:

1 2 3 9 5

始终是第 4 个值不匹配。第 1、第 2、第 3 和第 5 个值始终匹配。我想在 bash 脚本中执行此操作。到目前为止,我已经启动了这个脚本。

#! /bin/bash

#USAGE: sh ./script.sh test.dat check.dat

 TEST_FILE=$1
 CHECK_FILE=$2
## for each line in TEST_FILE
 while read line ; do

 arr=$(echo $line | tr " " "\n")
 part_match=$(echo ${arr:0:8})
 X=$(grep "$part_match" ${CHECK_FILE})

## So up to here, if the partial match exists in FILE2, I save the line in X.
## Then I try to substitute them with awk or sed but none of them works.

 awk '{gsub(/${X}/, "${line}")}' check.dat > check_new.dat
## OR
 sed -i "s/$X/$line/pw" check.dat

done < ${TEST_FILE}

它们都不起作用。我究竟做错了什么?非常感谢!

【问题讨论】:

  • 第 5 个值如何匹配,5 == 6?另外,“我想要这个”是什么意思?

标签: bash awk sed


【解决方案1】:

“如果文件 2 中存在部分匹配” - 基于0:8,如果您有部分匹配,您将获得完整匹配,因为这将包括第 4 位。

如果你想匹配前 3 位数字,那么你应该使用0:6

sed 命令也不正确 - 删除 w 标志或指定文件名。原地编辑原 check.dat:

sed -i "s/$X/$line/p" check.dat

或者,将更改写入 check_new.dat,保持 check.dat 原样

sed "s/$X/$line/pwcheck_new.dat" check.dat

【讨论】:

    【解决方案2】:

    求救!

     awk '{key=$1 FS $2 FS $3 FS $5} FNR==NR{a[key];next} key in a{print}' shortfile longfile
    

    将打印长文件中的匹配行。不过,尚不清楚您想如何处理此信息。

    【讨论】:

      猜你喜欢
      • 2016-10-24
      • 1970-01-01
      • 1970-01-01
      • 2021-10-04
      • 1970-01-01
      • 2016-09-15
      • 2021-12-20
      • 1970-01-01
      • 2020-09-14
      相关资源
      最近更新 更多