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

如何使用AWK合并两个文件?

文件1有5个字段ABCDE,字段A是一个整数值

文件2有3个字段AFG

文件1中的行数比文件2(20 ^ 6到5000)大很多,

文件1中A的所有条目出现在文件2中的字段A中

如何删除使用SED或AWK的第一行以外的奇数行

如何在Ubuntu中使用bash翻转文件中的所有单词?

使用awk从日志文件提取包含文本和数字的特定行

一个文件中search并添加一个模式

使用bash处理大量的数据

我喜欢把字段A中的两个文件合并,并携带F和G.

期望的输出是ABCDEFG

文件1

ABCDE 4050 S00001 31228 3286 0 4050 S00012 31227 4251 0 4049 S00001 28342 3021 1 4048 S00001 46578 4210 0 4048 S00113 31221 4250 0 4047 S00122 31225 4249 0 4046 S00344 31322 4000 1

文件2

AFG 4050 12.1 23.6 4049 14.4 47.8 4048 23.2 43.9 4047 45.5 21.6

期望的输出

ABCDEFG 4050 S00001 31228 3286 0 12.1 23.6 4050 S00012 31227 4251 0 12.1 23.6 4049 S00001 28342 3021 1 14.4 47.8 4048 S00001 46578 4210 0 23.2 43.9 4048 S00113 31221 4250 0 23.2 43.9 4047 S00122 31225 4249 0 45.5 21.6

按小时计数

Awk,tail,sed或其他 – 对于大文件哪个更快?

search文件中的模式的目录和子目录

将文本文件分割成多个文件

shell脚本用正则expression式从文本文件提取多行数据

$ awk 'FNR==NR{a[$1]=$2 FS $3;next}{ print $0,a[$1]}' file2 file1 4050 S00001 31228 3286 0 12.1 23.6 4050 S00012 31227 4251 0 12.1 23.6 4049 S00001 28342 3021 1 14.4 47.8 4048 S00001 46578 4210 0 23.2 43.9 4048 S00113 31221 4250 0 23.2 43.9 4047 S00122 31225 4249 0 45.5 21.6 4046 S00344 31322 4000 1

谢天谢地,你根本不需要写这个。 Unix有一个连接命令为你做这个。

join -1 1 -2 1 File1 File2

这里是“行动中”:

will-hartungs-computer:tmp will$ cat f1 4050 S00001 31228 3286 0 4050 S00012 31227 4251 0 4049 S00001 28342 3021 1 4048 S00001 46578 4210 0 4048 S00113 31221 4250 0 4047 S00122 31225 4249 0 4046 S00344 31322 4000 1 will-hartungs-computer:tmp will$ cat f2 4050 12.1 23.6 4049 14.4 47.8 4048 23.2 43.9 4047 45.5 21.6 will-hartungs-computer:tmp will$ join -1 1 -2 1 f1 f2 4050 S00001 31228 3286 0 12.1 23.6 4050 S00012 31227 4251 0 12.1 23.6 4049 S00001 28342 3021 1 14.4 47.8 4048 S00001 46578 4210 0 23.2 43.9 4048 S00113 31221 4250 0 23.2 43.9 4047 S00122 31225 4249 0 45.5 21.6 will-hartungs-computer:tmp will$

您需要将文件2中的条目读入BEGIN块中的一对关联数组。 假设GNU Awk:

BEGIN { while (getline < "File 2") { f[$1] = $2; g[$1] = $3 } }

在主处理块中,读取文件1中的行,并使用BEGIN块中创建的数组的正确数据打印:

{ print $0,f[$1],g[$1] }

提供文件1作为程序的文件名参数。

awk 'BEGIN { while (getline < "File 2") { f[$1] = $2; g[$1] = $3 } } print $0,g[$1] }' "File 1"

文件名参数周围的引号是需要的,因为文件名中有空格。 即使不包含空格,也需要围绕getline文件名引用引号,否则将是变量名称

awk 'BEGIN{OFS=","} FNR==NR {F[$1]=$2;G[$1]=$3;next} {print $1,$2,$3,$4,$5,F[$1],G[$1]}' file2.txt file1.txt

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

相关推荐