linux – Bash – 按列加入(合并)文件

有三个带列的文件,分隔符为“|”,行中的列可能为空.我需要连接第二个和第三个文件,首先使用第一个文件中的第3列和第4列,第二个和第三个中使用第1列.

例如:

FILE1.TXT:

123456||4|11|17|A||10|B|1
123457||4|11|17|A||12||1
123458||5|11|17|A||1|Б|1
123459||6|13|17|A||1|Б|1

FILE2.TXT:

4|Forth
5|Fifth
6|Sixth

file3.txt:

11|st.|Eleventh
13|pr.|Thirteenth

我想要的输出是什么:

123456||4|Forth|11|st.|Eleventh|17|A||10|B|1
123457||4|Forth|11|st.|Eleventh|17|A||12||1
123458||5|Fifth|11|st.|Eleventh|17|A||1|Б|1
123459||6|Sixth|13|pr.|Thirteenth|17|A||1|Б|1

如何编写将执行我需要的Bash脚本?我知道这是awt命令,但我无法编写脚本.谢谢你的回答.

解决方法:

你可以使用这个awk命令:

awk 'BEGIN{ FS=OFS="|" }
     NR == FNR {a[$1]=$0; next}
     NR == FNR + length(a) {b[$1]=$0; next}
     {$3=b[$3]; $4=a[$4]} 1' file3.txt file2.txt file1.txt
123456||4|Forth|11|st.|Eleventh|17|A||10|B|1
123457||4|Forth|11|st.|Eleventh|17|A||12||1
123458||5|Fifth|11|st.|Eleventh|17|A||1|Б|1
123459||6|Sixth|13|pr.|Thirteenth|17|A||1|Б|1

说明:

> BEGIN {FS = OFS =“|” – 将输入和输出字段分隔符设置为管道|
> NR == FNR – 仅对第一个文件执行此块
> a [$1] = $0; next – 创建一个数组a,其键为$1,值为完整行
> NR == FNR长度(a) – 仅对第二个文件执行此块
> b [$1] = $0; next – 创建一个数组b,其键为$1,值为完整行
>为最后(第3个)文件执行下一个块{…}
> $3 = b [$3]; – 将b [$3]的值分配给第3个字段
> 4美元= [4美元]; – 将[$4]的值分配给第4个字段
> 1 – 是打印每条记录的认操作

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...