【问题标题】:Replacing column 2 in original with column 2 in new将原来的第 2 列替换为新的第 2 列
【发布时间】:2019-01-21 01:35:41
【问题描述】:

我有一个包含数千个原始结果的文件和一个包含数百个新结果的文件。只有新的第 2 列与原来的不同。我还需要保留未更改的原始结果。我该怎么做呢?是否可以创建一个包含未更改的原始结果和新结果的文件 3?请参阅下面的示例。

Original            New             file3  

1:1:1              2:5:2            1:1:1   
2:2:2              3:4:3            2:5:2  
3:3:3              5:9:5            3:4:3  
4:4:4              6:8:6            4:4:4  
5:5:5                               5:9:5  
6:6:6                               6:8:6  
7:7:7                               7:7:7   

【问题讨论】:

    标签: file awk sed merge


    【解决方案1】:

    awk

      awk -F':' '{a[$1]=$0}END{for(i in a) print a[i]}' Original_file new_file | sort
    

    Original_file new_file - 读取两个文件

    对于每个文件读取行和:

    1) -F':' - 使用 : 作为分隔符

    2) a[$1]=$0 - 创建一个哈希,它的键是第一列,值是所有行。如果键存在,则使用新值运行它。

    3) for(i in a) print a[i] - 打印哈希值

    4) sort - 按顺序对结果进行排序

    【讨论】:

      【解决方案2】:

      您可以在旧文件和新文件之间使用 diff 命令。

      diff -y Original.txt New.txt

      Original             New
      
       1:1:1              1:1:1
       2:2:2         |    2:5:2
       3:3:3         |    3:4:3
       4:4:4              4:4:4
       5:5:5         |    5:9:5
       6:6:6         |    6:8:6
       7:7:7              7:7:7
      

      对于每一行,如果它包含这个字符“|”使用命令awk 捕获新文件的值。否则捕捉两边之一的值,毕竟两者相等。

      试试这个:

      number_of_lines_pipe=$(diff -y Orginal.txt New.txt | grep -e "|" | wc - l)
      number_of_lines_without_pipe=$(diff -y Orginal.txt New.txt | grep -v "|" | wc - l)
      
      for ((i = 1; i <= $number_of_lines_pipe; i++))
      do
          line=$(diff -y Orginal.txt New.txt | grep -e "|" | sed -n $i'p')
          echo "$line" | awk -F"|" '{ print $2 }' | sed 's/\t *//' >> File3.log
      done
      
      for ((i = 1; i <= $number_of_lines_without_pipe; i++))
      do
          line=$(diff -y Orginal.txt New.txt | grep -v "|" | sed -n $i'p')
          echo "$line" | awk -F" " '{ print $1 }' >> File3.log
      done
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-20
        • 2018-11-12
        • 2021-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多