微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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 – 是打印每条记录的认操作

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐