用原始的第2列替换原始的第2列

时间:2018-08-14 08:43:46

标签: file awk sed merge

我有一个包含数千个原始结果的文件,一个包含数百个新结果的文件。仅new的第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   

2 个答案:

答案 0 :(得分:1)

您可以在旧文件和新文件之间使用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

答案 1 :(得分: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-按顺序对结果进行排序