linux - 如果行匹配,如何在目标文件中标记行

标签 linux bash perl awk sed

我的 bash 脚本从文件中读取每一行 -/tmp/file.CSV 直到 EOF

然后查找此行是否匹配其他文件中的行 -/tmp/target.CSV(如果完全匹配 bash 脚本需要在匹配行的开头添加“+”)

例如

  line="/VPNfig/EME/EM3/Ucll/ucelobeconn/6EKoHH11" ( from /tmp/file.CSV )

我们看到 $line 与 line: 完全匹配

    1,ull,LINUX,"/VPNfig/EME/EM3/Ucll/ucelobeconn/6EKoHH11",fnt,rfdr,OK ( from /tmp/target.CSV )

然后我们需要在/tmp/target.CSV中的行中添加“+”作为

   +1,ull,LINUX,"/VPNfig/EME/EM3/Ucll/ucelobeconn/6EKoHH11",fnt,rfdr,OK

请建议如何在我的 bash 脚本中使用 sedawk 或者 perl one liner

 more /tmp/target.CSV


 1,ull,LINUX,"/VPNfig/EME/EM3/Ucll/ucelobeconn/6EKoHH11",fnt,rfdr,OK
 2,Ama,LINUX,"/VPNfig/EME/EM8/Franlecom Eana SA/Amen",comrse,temporal,OK
 3,ArnTel,LINUX,"/VPConfig/EME/EM3/ArmenTem Armenia)/ArmenTe",Coers,FAIL
 4,Ahh,LINUX,"/VPConfig/EMA/EM/llk/AAe",Coers,FAIL
 142,ucell,LINUX,/VPNAAonfig/EMEA/EM3/Ucell/ede3fc34,Glo,G/rvrev443,OK

 more file.CSV

 /VPNfig/EME/EM3/Ucll/ucelobeconn/6EKoHH11
 /VPNfig/EME/EM8/Franlecom Eana SA/Amen
 /VPConfig/EME/EM3/ArmenTem Armenia)/ArmenTe
 /VPConfig/EME/EM0/TTR/Ar
 /VPNAAonfig/EMEA/EM3/Ucell/ede3fc34

我的 bash 代码

 while read -r line
 do

 grep -iq "$line" /tmp/target.CSV 

 if [[  $? -ne 0 ]]
 then
       echo  "$line" NOT MATCH target.CSV
      else

     sed .................

     fi
 done <  /tmp/file.CSV

预期结果示例(根据文件/tmp/target.CSV file.CSV )

     more /tmp/target.CSV


    +1,ull,LINUX,"/VPNfig/EME/EM3/Ucll/ucelobeconn/6EKoHH11",fnt,rfdr,OK
    +2,Ama,LINUX,"/VPNfig/EME/EM8/Franlecom Eana SA/Amen",comrse,temporal,OK
    +3,ArnTel,LINUX,"/VPConfig/EME/EM3/ArmenTem Armenia)/ArmenTe",Coers,FAIL
     4,Ahh,LINUX,"/VPConfig/EMA/EM/llk/AAe",Coers,FAIL



more file.CSV

+/VPNfig/EME/EM3/Ucll/ucelobeconn/6EKoHH11
+/VPNfig/EME/EM8/Franlecom Eana SA/Amen
+/VPConfig/EME/EM3/ArmenTem Armenia)/ArmenTe
 /VPConfig/EME/EM0/TTR/Ar
+/VPNAAonfig/EMEA/EM3/Ucell/ede3fc34

最佳答案

awk -F\" -v OFS=\" 'FNR==NR{ a[$0]++; next} $2 in a { $0 = "+" $0 } 1' file.csv target.csv 

输出:

+1,ull,LINUX,"/VPNfig/EME/EM3/Ucll/ucelobeconn/6EKoHH11",fnt,rfdr,OK
+2,Ama,LINUX,"/VPNfig/EME/EM8/Franlecom Eana SA/Amen",comrse,temporal,OK
+3,ArnTel,LINUX,"/VPConfig/EME/EM3/ArmenTem Armenia)/ArmenTe",Coers,FAIL
4,Ahh,LINUX,"/VPConfig/EMA/EM/llk/AAe",Coers,FAIL

或者

awk -F\" -v OFS=\" 'FNR==NR{ a[$0]++; next} { print ($2 in a ? "+" : " ") $0 }' file.csv target.csv 
awk -F\" -v OFS=\" 'FNR==NR{ a[$0]++; next} { $0 = ($2 in a ? "+" : " ") $0 } 1' file.csv target.csv

输出:

+1,ull,LINUX,"/VPNfig/EME/EM3/Ucll/ucelobeconn/6EKoHH11",fnt,rfdr,OK
+2,Ama,LINUX,"/VPNfig/EME/EM8/Franlecom Eana SA/Amen",comrse,temporal,OK
+3,ArnTel,LINUX,"/VPConfig/EME/EM3/ArmenTem Armenia)/ArmenTe",Coers,FAIL
 4,Ahh,LINUX,"/VPConfig/EMA/EM/llk/AAe",Coers,FAIL

不管每行是否以一个空格开头,这个都是有效的:

awk -F\" -v OFS=\" 'FNR==NR{ a[$0]++; next} { sub(/^ ?/, $2 in a ? "+" : " ") } 1' file.csv target.csv

尝试

awk -F\" -v OFS=\" 'FNR==NR{ a[$0]++; next} { sub(/^ ?/, $2 in a ? "+" : " ") } 1' file.csv target.csv

更新(一)

awk -F, -v OFS=, 'FNR==NR{ sub(/[ \t\r]*$/, ""); a[$0]++; next} { t = $4; gsub(/(^"|"$)/, "", t); sub(/^[ \t]*/, t in a ? "+" : " "); } 1' file.csv target.csv 

输出:

+1,ull,LINUX,"/VPNfig/EME/EM3/Ucll/ucelobeconn/6EKoHH11",fnt,rfdr,OK
+2,Ama,LINUX,"/VPNfig/EME/EM8/Franlecom Eana SA/Amen",comrse,temporal,OK
+3,ArnTel,LINUX,"/VPConfig/EME/EM3/ArmenTem Armenia)/ArmenTe",Coers,FAIL
 4,Ahh,LINUX,"/VPConfig/EMA/EM/llk/AAe",Coers,FAIL
+142,ucell,LINUX,/VPNAAonfig/EMEA/EM3/Ucell/ede3fc34,Glo,G/rvrev443,OK

更新(二)

awk -F, -v OFS=, 'FNR==NR{ sub(/[ \t\r]$/, ""); a[$0]++; b[FNR]=$0; next} { t = $4; gsub(/(^"|"$)/, "", t); r = " "; if (t in a) { c[t]++; r = "+" }; sub(/^[ \t]*/, r); } 1; END { for (i = 1; i in b; ++i) { t = b[i]; sub(/^[ \t]*/, t in c ? "+" : " ", t); print t > "/dev/stderr" } }' file.csv target.csv > new_target.csv 2> new_file.cs

关于linux - 如果行匹配,如何在目标文件中标记行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25021232/

相关文章:

php - 将变量从 php 传递到 bash

bash - 将 stdout 和 stderr 重定向到带有前缀的单个文件

git - 阻止将琐碎的 merge 推送到 git 服务器

Perl:无法使用 SSL 访问 Web 服务

linux - Swift 3 预览版 2 Linux 错误 : use of unresolved identifier

c - 有没有开源的命令行库?

php - 想通过php文件传递bash文件中的参数

windows - 使用 Perl,如何检查具有给定名称的进程是否正在运行?

perl - 获取数据::转储对象打印错误

java - 安装 Java 7 以及已安装的 Java 8 以便能够构建 Android 应用程序