linux - 在 linux 中使用 awk 合并两个文件

标签 linux bash shell awk

我有一个 1.txt 文件:

betomak@msn.com||o||0174686211||o||7880291304ca0404f4dac3dc205f1adf||o||Mario||o||Mario||o||Kawati
zizipi@libero.it||o||174732943.0174732943||o||e10adc3949ba59abbe56e057f20f883e||o||Tiziano||o||Tiziano||o||D'Intino
frankmel@hotmail.de||o||0174844404||o||8d496ce08a7ecef4721973cb9f777307||o||Melanie||o||Melanie||o||Kiesel
apoka-paris@hotmail.fr||o||0174847613||o||536c1287d2dc086030497d1b8ea7a175||o||Sihem||o||Sihem||o||Sousou
sofianomovic@msn.fr||o||174902297.0174902297||o||9893ac33a018e8d37e68c66cae23040e||o||Nabile||o||Nabile||o||Nassime
donaldduck@yahoo.com||o||174912161.0174912161||o||0c770713436695c18a7939ad82bc8351||o||Donald||o||Donald||o||Duck
cernakova@centrum.cz||o||0174991962||o||d161dc716be5daf1649472ddf9e343e6||o||Dagmar||o||Dagmar||o||Cernakova
trgsrl@tiscali.it||o||0175099675||o||d26005df3e5b416d6a39cc5bcfdef42b||o||Esmeralda||o||Esmeralda||o||Trogu
catherinesou@yahoo.fr||o||0175128896||o||2e9ce84389c3e2c003fd42bae3c49d12||o||Cat||o||Cat||o||Sou
ermimurati24@hotmail.com||o||0175228687||o||a7766a502e4f598c9ddb3a821bc02159||o||Anna||o||Anna||o||Beratsja
cece_89@live.fr||o||0175306898||o||297642a68e4e0b79fca312ac072a9d41||o||Celine||o||Celine||o||Jacinto
kendinegel39@hotmail.com||o||0175410459||o||a6565ca2bc8887cde5e0a9819d9a8ee9||o||Adem||o||Adem||o||Bulut

一个 2.txt 文件:

9893ac33a018e8d37e68c66cae23040e:134:@a1
536c1287d2dc086030497d1b8ea7a175:~~@!:/92\
8d496ce08a7ecef4721973cb9f777307:demodemo

1.txt 的 FS 是“||o||”对于 2.txt 是“:” 我想将两个文件合并到一个文件 result.txt 中,条件是 1.txt 的第 3 列必须与 2.txt 文件的第 1 列匹配并且应该被 2.txt 文件的第 2 列替换。

预期的输出将包含所有匹配的行: 我正在向您展示其中之一:

sofianomovic@msn.fr||o||174902297.0174902297||o||134:@a1||o||Nabile||o||Nabile||o||Nassime

我试过这个脚本:

awk -F"||o||"  'NR==FNR{s=$0; sub(/:[^:]*$/, "", s); a[s]=$NF;next} {s = $5; for (i=6; i<=NF; ++i) s = s "," $i; if (s in a) { NF = 5; $5=a[s]; print } }' FS=: <(tr -d '\r' < 2.txt) FS="||o||" OFS="||o||" <(tr -d '\r' < 1.txt) > result.txt

但是结果得到一个空文件。任何帮助将不胜感激。

最佳答案

如果您的实际 Input_file(s) 与显示的示例相同,那么遵循 awk 可能会对您有所帮助。

awk -v s1="||o||" '
FNR==NR{
  a[$9]=$1 s1 $5;
  b[$9]=$13 s1 $17 s1 $21;
  next
}
($1 in a){
  print a[$1] s1 $2 FS $3 s1 b[$1]
}
' FS="|" 1.txt FS=":" 2.txt

编辑: 由于 OP 稍微更改了要求,因此根据新询问提供代码,它将在何处创建 2 个文件,其中 1 个文件的 ID 将出现在 1 中。 txt 和 NOT 在 2.txt 和其他将反之亦然。

awk -v s1="||o||" '
FNR==NR{
  a[$9]=$1 s1 $5;
  b[$9]=$13 s1 $17 s1 $21;
  c[$9]=$0;
  next
}
($1 in a){
  val=$1;
  $1="";
  sub(/:/,"");
  print a[val] s1 $0 s1 b[val];
  d[val]=$0;
  next
}
{
  print > "NOT_present_in_2.txt"
}
END{
for(i in d){
  delete c[i]
};
for(j in c){
  print j,c[j] > "NOT_present_in_1.txt"
}}
' FS="|" 1.txt FS=":" OFS=":" 2.txt

关于linux - 在 linux 中使用 awk 合并两个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48089352/

相关文章:

linux - 将大数据写入套接字时最小化副本

在内存中创建和使用新堆栈

node.js - AWS CodeDeploy AfterInstall 脚本正在从代码部署代理目录运行

linux - 查找localhost:8080文件夹和文件

linux - Linux 中一个简单程序的奇怪行为

python - 从 bash 向 python 发送参数

linux - 关于 egrep 命令

ruby - Chef shell脚本交互

shell - 从 .zshrc 导出 PYTHONPATH 不起作用

android - 尝试从 cmd 提示符执行 proc rank,但不工作