Input 在awk中查找并替换为两个文件

Input 在awk中查找并替换为两个文件,input,awk,gawk,Input,Awk,Gawk,我试图用一行AWK代码来纠正一个文件与另一个文件之间的错误。我试图从FILE2中获取$1,在FILE1中查找,得到相应的$3和$4。在我将它们设置为变量之后,我希望程序停止计算FILE1,将FILE2中的$10和$11更改为变量的值,然后打印出来 在提取变量后,我很难让awk从文件1切换到文件2。我尝试了nextfile,但这会重置程序,它会从文件2中提取变量,我将NR设置为最后一条记录,但它没有切换 我也在做一个循环,让每一行从FILE1中出来,但如果这可以成为脚本的一部分,我相信它会加快速度

我试图用一行AWK代码来纠正一个文件与另一个文件之间的错误。我试图从FILE2中获取$1,在FILE1中查找,得到相应的$3和$4。在我将它们设置为变量之后,我希望程序停止计算FILE1,将FILE2中的$10和$11更改为变量的值,然后打印出来

在提取变量后,我很难让awk从文件1切换到文件2。我尝试了nextfile,但这会重置程序,它会从文件2中提取变量,我将NR设置为最后一条记录,但它没有切换

我也在做一个循环,让每一行从FILE1中出来,但如果这可以成为脚本的一部分,我相信它会加快速度,而不必一次又一次地重新打开awk

这是我已经弄明白的部分

for file in `cut -f 1 FILE2`; do
awk -v a=$file '$1=a{s=$2;q=$4; ---GO TO FILE1---}{if ($1==a) {$10=s; $11=q; print 0;exit}' FILE1 FILE2 >> FILEOUT
done
一个简单的示例集说明:尽管我是如何编写这篇文章的,但这两个文件的顺序不同,大小约为8GB,因此排序有点不方便

文件1

文件2

外锉

A 2 3 4 5 6 7 8 9 12345 AJD$JD 
B 2 3 4 5 6 7 8 9 12504 DKFJ#%
C 2 3 4 5 6 7 8 9 52042 DSJTJE
这是我根据肯特下面的答案得到的代码

awk 'NR==FNR{a[$1]=$2" "$4;next}$1 in a{$9=$9" "a[$1]}{$10="";$11=""}2' f1 f2 

无需重复循环文件-只需读取一个文件并将相关字段存储在键入
$1
的数组中,然后遍历另一个文件并使用这些数组查找要插入的值

awk '(FILENAME=="FILE1"){y[$1]=$2;z[$1]=$4}; (FILENAME=="FILE2" && $1 in y){$10=y[$1];$11=z[$1];print $0}' FILE1 FILE2
这就是说,听起来您可能在这里使用了
join
命令,而不是在awk中胡闹(上面的脚本假定所有
$1
/
$2
/
$4
值都可以放入内存中)。

尝试以下一行代码:

kent$  awk 'NR==FNR{a[$1]=$2" "$4;next}$1 in a{NF-=2;$0=$0" "a[$1]}7' f1 f2
A 2 3 4 5 6 7 8 9 12345 AJD$JD
B 2 3 4 5 6 7 8 9 12504 DKFJ#%
C 2 3 4 5 6 7 8 9 52042 DSJTJE

提供输入/输出示例将帮助您更快地得到答案。快速提问,应该从第二部分开始“(FILENAME==“FILE2”&&x[$1]==$1)”?否。
x
旨在成为一个数组,让我们轻松检查FILE1中存在哪些
$1
值。该数组中存在一个键这一事实是很重要的——存储在该键上的值是不相关的(我只是使用了常量
1
)。实际上,我的代码有点脑死亡——阅读另一个答案让我想起了
in
操作符,我可能应该使用它。我已经编辑了我的答案来使用它,并且去掉了
x
——希望检查的意图现在已经很清楚了。我仍然在努力理解这一点(我很难理解数组)。然而,我得到的输出没有10美元和11美元。上面的描述不准确。如果设置了文件名==FILE1和文件名==FILE2,则不会得到任何输出。当我使它们相同,我得到的文件不变(如果我更正数组中的列。我在文件中检查了这一点,我只是得到了未更改的f2作为输出。我认为一个问题是F1在f2中有所有的行,但反之亦然。我想我可以用完整的集合来试一下,看看会发生什么。@user2348290这不应该是问题。你能用你的问题中的小例子来测试吗?)在上,如果我的一行程序适用于它?好吧,我知道发生了什么(f1中的1在$1前面有一个@)。我唯一的问题是$11后面有可选字段,有时在那里,有时不在(很抱歉,我没有在我的示例中包括这个)。我怎样才能让这个脚本用数组输入严格地替换$10和$11?好吧,所以我编辑了代码来做我想让它做的事情。我把它放在了原始的帖子中。但我不明白其中的两个部分。第1部分:我不明白为什么输出在没有打印命令的情况下打印。第2部分(我想这是我第一个问题的一部分)语句末尾的数字是什么“7”。我把它改成了其他数字,没有明显的影响。只是好奇而已
awk '(FILENAME=="FILE1"){y[$1]=$2;z[$1]=$4}; (FILENAME=="FILE2" && $1 in y){$10=y[$1];$11=z[$1];print $0}' FILE1 FILE2
kent$  awk 'NR==FNR{a[$1]=$2" "$4;next}$1 in a{NF-=2;$0=$0" "a[$1]}7' f1 f2
A 2 3 4 5 6 7 8 9 12345 AJD$JD
B 2 3 4 5 6 7 8 9 12504 DKFJ#%
C 2 3 4 5 6 7 8 9 52042 DSJTJE