我有一个包含数千个原始结果的文件,一个包含数百个新结果的文件。仅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
答案 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
-按顺序对结果进行排序