繁体   English   中英

Append 数据从一个文件到另一个使用 AWK

[英]Append data from 1 file to another using AWK

我有一个已经存在的脚本来检查 2 个文件之间的专有数据并将其加载到第 3 个文件中。 命令如下。

var='FNR == NR {keys[$1 $2]; next} !($1 $2 in keys)'
awk -F\| $var file1.dat file2.dat > file3.dat

要求是重用相同但只是 append 的数据从文件 2 到文件 3 忽略文件 1。 我尝试执行以下操作,但它正在后台处理来自 file1 和 file2 的数据。 我所需要的只是,虽然 awk 命令中提供了 2 个文件名,但只附加了第二个文件数据。

var='{print $0}'
awk -F\| $var file1.dat file2.dat > file3.dat    

任何人都可以帮助确切的命令。 以下是每个文件中的数据和预期的 output。

File1 (可以有 0 个或更多) - 我们根本不应该看这个文件

123
456
789

文件2:

123
ABC
XYZ
456

File3 中的预期 output (全部来自 file2,只是忽略 file1 输入,但我必须在 awk 命令中有 file1 名称)

123
ABC
XYZ
456

全部来自file2并忽略file1输入,但我必须在 awk 命令中有 file1 名称。

如果您必须在 arguments 到 awk 命令中使用file1file2并且只想使用来自file2的 output 内容,那么您可以使用:

awk 'BEGIN {delete ARGV[1]} 1' file1 file2 > file3

123
ABC
XYZ
456

delete ARGV[1]将从参数列表中删除第一个参数。

使用您显示的示例和尝试,请尝试遵循awk代码。 在 GNU awk中编写和测试。 只需使用nextfile跳过名为 file1 的第一个 Input_file 并继续读取第二个文件。

awk 'NR==1{nextfile} 1' file1 file2

还记得不要浪费时间拆分不需要的字段

{m,g}awk 'BEGIN { delete ARGV[_^=FS="^$"] }_' file1 file2

而且一次不读一行会更快:

 mawk2 'BEGIN { delete ARGV[_^=FS="^$"] }_' "${m2p}" "${m3t}"
 out9: 1.85GiB 0:00:01 [1.11GiB/s] [1.11GiB/s] [ <=>]
 f9d2e18d22eb58e5fc2173863cff238e  stdin
 mawk2 'BEGIN { delete ARGV[_^=RS=FS="^$"] }_^(ORS=__)' "${m2p}" "${m3t}"
 out9: 1.85GiB 0:00:00 [1.92GiB/s] [1.92GiB/s] [<=> ]
 f9d2e18d22eb58e5fc2173863cff238e  stdin

并尽量避免gawk的慢速默认模式:

 gawk 'BEGIN { delete ARGV[_^=FS="^$"] }_' "${m2p}" "${m3t}"
 out9: 1.85GiB 0:00:03 [ 620MiB/s] [ 620MiB/s] [ <=> ]
 f9d2e18d22eb58e5fc2173863cff238e  stdin

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM