我想使用命令将文件 1(100 万行)和文件 2(10,000 行)加入到新文件 3(应该是 100 万行)awk
中
文件1:
471808241 29164840 1 10001 156197396
471722917 21067410 1 31001 135961856
471941441 20774160 1 7001 180995072
471568655 29042630 1 15001 157502996
471524711 20716360 1 4001 180226817
471873918 29583520 1 2001 128567298
471568650 29042631 1 15002 157502910
文件2
610146 156197396
531101 135961856
704011 180226817
502216 128567298
707012 180995072
615246 157502996
685221 157502910
期望的输出:
471808241 29164840 1 10001 156197396 610146
471722917 21067410 1 31001 135961856 531101
471941441 20774160 1 7001 180995072 707012
471568655 29042630 1 15001 157502996 615246
471524711 20716360 1 4001 180226817 704011
471873918 29583520 1 2001 128567298 502216
471568650 29042631 1 15002 157502910 685221
答案1
我想加入这两个文件
join
因此,将文件按键顺序排序后使用命令:
排序 -b -k 5 文件 1 > 排序文件 1 排序 -b -k 2 文件 2 > 排序文件 2 join -1 5 -2 2 -o 1.1,1.2,1.3,1.4,2.2,2.1 排序文件1 排序文件2
进一步阅读
- “公用事业:加入”。 外壳命令语言。单一 UNIX 规范。第 7 期。IEEE 1003.1。 2016。公开组。
答案2
$ awk 'NR==FNR{a[$2]=$1; next} {sub(" ?$"," "a[$5]); print}' file2 file1
471808241 29164840 1 10001 156197396 610146
471722917 21067410 1 31001 135961856 531101
471941441 20774160 1 7001 180995072 707012
471568655 29042630 1 15001 157502996 615246
471524711 20716360 1 4001 180226817 704011
471873918 29583520 1 2001 128567298 502216
471568650 29042631 1 15002 157502910 685221
NR==FNR
如果当前行号与文件行号相同,则仅适用于第一个文件参数file2
a[$2]=$1; next
从行中保存键值对file2
,next
用于跳过其余代码sub(" ?$"," "a[$5])
使用替换将行尾的可选空格替换为a
基于第五列作为键的数组中的空格和值print
然后打印修改后的输入行file1
答案3
从 10,000 个键中进行一百万次查找,如果需要性能,请使用 perl:
#!/usr/bin/perl
# create hash from file2
($f2) = pop @ARGV;
%hash = map { reverse split } do { local @ARGV=($f2); <>};
# loop over file1
while ( <> ) {
chomp;
@F = split;
print "$_ $hash{$F[4]}\n";
}
答案4
珀尔
perl -lpe '
BEGIN{ %h = do{local(@ARGV,$/)=pop;<>} =~ s/^(\s*\d+)(\s\d+)$/$2 $1/mgr =~ //mg;
$_ .= $h{(/(\s\d+)$/)[0]};
' File1 File2
重击
while read -r value key; do eval "_h_$key='$value';"; done < File2
while read -r _1 _2 _3 _4 _5; do
eval "x=\$_h_$_5"
printf '%s ' "$_1" "$_2" "$_3" "$_4" "$_5"
echo "$x"
done < File1
塞德
echo '.' >> File2
sed -e '
1{
:file2
N
/\n\.$/!bfile2
H;d
}
G
s/\([ ][0-9][0-9]*\)\n.*\n\([0-9][0-9]*\)\1\n.*/\1 \2/
' File2 File1