linux – Bash – 按列加入(合并)文件
发布时间:2020-12-13 23:51:25 所属栏目:Linux 来源:网络整理
导读:有三个带列的文件,分隔符为“|”,行中的列可能为空.我需要连接第二个和第三个文件,首先使用第一个文件中的第3列和第4列,第二个和第三个中使用第1列. 例如: FILE1.TXT: 123456||4|11|17|A||10|B|1123457||4|11|17|A||12||1123458||5|11|17|A||1|Б|1123459|
有三个带列的文件,分隔符为“|”,行中的列可能为空.我需要连接第二个和第三个文件,首先使用第一个文件中的第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,值为完整行>为最后(第3个)文件执行下一个块{…}> $3 = b [$3]; – 将b [$3]的值分配给第3个字段> 4美元= [4美元]; – 将[$4]的值分配给第4个字段> 1 – 是打印每条记录的默认操作 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |