当bash中的另一个文本文件中也出现相同的数字时,更改文本文件中的字符串
我有两个文件,每行的名称几乎相同。这些数字定义了两个文本文件中每一行的唯一性。出现在当bash中的另一个文本文件中也出现相同的数字时,更改文本文件中的字符串,bash,Bash,我有两个文件,每行的名称几乎相同。这些数字定义了两个文本文件中每一行的唯一性。出现在file1.txt中的所有数字也出现在file2.txt中。但并非相反,这意味着file2.txt有更多的字符串。但是file2.txt包含正确的名称,有时可以是OUT\u P-[number]或OUT\u D-B-CP-[number]。因此,我想更改file1.txt中的字符串,因为它们出现在file2.txt中。 因此: 如果在file2.txt中出现完全相同的字符串,我想在file1.txt中保留行。但是
file1.txt
中的所有数字也出现在file2.txt
中。但并非相反,这意味着file2.txt
有更多的字符串。但是file2.txt
包含正确的名称,有时可以是OUT\u P-[number]
或OUT\u D-B-CP-[number]
。因此,我想更改file1.txt
中的字符串,因为它们出现在file2.txt
中。
因此:
如果在file2.txt
中出现完全相同的字符串,我想在file1.txt
中保留行。但是如果file2.txt
中存在与file1.txt
中的编号相同的OUT\u P-[number]
,则将file1.txt
中的字符串更改为OUT\u P-[number]
。例如:file1.txt
具有OUT\u D-B-CP-0001
,但是file2.txt
具有OUT\u P-0001
,然后在file1.txt
中也对其进行更改。并且数字只出现在file2.txt
中的字符串应该被忽略,而不是添加到file1.txt
中
file1.txt:
OUT_D-B-CP-0001
OUT_D-B-CP-0002
OUT_D-B-CP-0005
OUT_D-B-CP-0007
OUT_D-B-CP-0008
OUT_D-B-CP-0009
OUT_D-B-CP-0014
OUT_D-B-CP-0022
OUT_D-B-CP-0024
OUT_D-B-CP-0025
OUT_D-B-CP-0027
OUT_D-B-CP-0032
OUT_D-B-CP-0038
OUT_D-B-CP-0246
OUT_D-B-CP-0249
OUT_D-B-CP-0250
OUT_D-B-CP-0260
file2.txt:
OUT_P-0001
OUT_P-0002
OUT_P-0005
OUT_P-0007
OUT_P-0008
OUT_D-B-CP-0009
OUT_P-0014
OUT_P-0022
OUT_P-0024
OUT_P-0025
OUT_D-B-CP-0026
OUT_P-0027
OUT_D-B-CP-0028
OUT_P-0032
OUT_P-0033
OUT_P-0038
OUT_D-B-CP-0057
OUT_D-B-CP-0085
OUT_D-B-CP-0087
OUT_D-B-CP-0121
OUT_D-B-CP-0178
OUT_P-0246
OUT_P-0249
OUT_P-0250
OUT_D-B-CP-0260
输出:
OUT_P-0001
OUT_P-0002
OUT_P-0005
OUT_P-0007
OUT_P-0008
OUT_D-B-CP-0009
OUT_P-0014
OUT_P-0022
OUT_P-0024
OUT_P-0025
OUT_P-0027
OUT_P-0032
OUT_P-0038
OUT_P-0246
OUT_P-0249
OUT_P-0250
OUT_D-B-CP-0260
我试过这样做:awk-F-'NR==FNR{seen[$NF];next}($NF in seen)'file2.txt file1.txt>output.txt
我不知道如何在bash中制作,有人能帮我吗?注意
不是一个纯粹的bash解决方案,但是。。。
这个一行命令应该可以做到这一点。在busybox awk上测试
$ awk 'BEGIN{n=0}{s=$0; sub(/^[^0-9]+/,"",s); sub(/[0-9]+$/,"",$0); id[s]=$0; if(n<s+0)n=s+0} END {for(i=1;i<=n;i++) {v=sprintf("%04d",i); if(id[v]!="") printf("%s%s\n",id[v],v) > "output.txt"}}' file1 file2
$awk'BEGIN{n=0}{s=$0;sub(/^[^0-9]+/,“”,s);sub(/[0-9]+$/,“”,0),$0);id[s]=$0;if(n)
$ awk 'BEGIN{n=0} NR==FNR {s=$0; sub(/^[^0-9]+/,"",s); sub(/[0-9]+$/,"",$0); id[s]=$0; if(n<s+0) n=s+0; next}{s=$0; sub(/^[^0-9]+/,"",s); sub(/[0-9]+$/,"",$0); if(id[s]!="") {id[s]=$0; if(n<s+0) n=s+0}} END {for(i=1;i<=n;++i) {v=sprintf("%04d",i); if(id[v]!="") printf("%s%s\n",id[v],v) > "output.txt"}}' file1 file2