Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash Awk,根据不同文件行的匹配方式打印某些列_Bash_Unix_Awk_Command Line - Fatal编程技术网

Bash Awk,根据不同文件行的匹配方式打印某些列

Bash Awk,根据不同文件行的匹配方式打印某些列,bash,unix,awk,command-line,Bash,Unix,Awk,Command Line,我很确定这是我必须使用的awk 我有一个文件包含我需要的信息,另一个文件需要从第二个文件中获取两条信息,并根据该信息从第二个文件中获取两个数字。 因此,如果第一个文件的第五列中有m7,第三列中有3,我想在第二列中搜索第一列中有3,第四列中有m7的行。我想打印这些文件中的某些列,如下所示 给定以下两个输入文件 文件1 文件2 我想生产产品 pre3 695 842 21 pre5 847 881 50 pre6 312 430 20 pre8 910 9

我很确定这是我必须使用的awk 我有一个文件包含我需要的信息,另一个文件需要从第二个文件中获取两条信息,并根据该信息从第二个文件中获取两个数字。 因此,如果第一个文件的第五列中有m7,第三列中有3,我想在第二列中搜索第一列中有3,第四列中有m7的行。我想打印这些文件中的某些列,如下所示

给定以下两个输入文件 文件1

文件2

我想生产产品

pre3   695   842   21
pre5   847   881   50
pre6   312   430   20
pre8   910   920   1
pre8   695   842   50
编辑:

我还需要生成表单的输出

pre3   695   842   pre8   910   920   1
pre5   847   881   pre8   695   842   50
pre6   312   430   pre3   695   842   20

下面的答案适用于之前的问题,但我对它的一些语法感到困惑,因此我不确定如何调整它以使此输出

您可以使用以下命令:

awk 'NR==FNR {a[$3 FS $5]=1;next } a[$1 FS $4]' f1.txt f2.txt
如果要仅打印第二个文件中匹配行中的特定字段,请使用以下方法:

awk 'NR==FNR {a[$3 FS $5]=1;next } a[$1 FS $4] { print "pre"$1" "$2" "$3}' f1.txt f2.txt
此命令:

awk 'NR==FNR{ar[$5,$3]=$1+ar[$5,$3]; ar[$6,$4]=$1+ar[$6,$4]}
     NR>FNR && ar[$4,$1] {print "pre"$1,$2,$3,ar[$4,$1]}' file1 file2
对于第一个文件的第五列和第三列(或第六列和第四列)的内容与第二个文件的第四列和第一列内容相同的所有行,输出
pre
加上第二个文件的第一列、第二列和第三列以及第一个文件的第一列的内容:

pre3 695 842 21
pre5 847 881 50
pre8 910 920 1
pre8 695 842 50
pre6 312 430 20
(对于具有多个匹配项的行,ar[$4,$1]的值相加)

请注意,输出不一定经过排序!要实现此目的,请添加
排序

awk 'NR==FNR{ar[$5,$3]=$1+ar[$5,$3]; ar[$6,$4]=$1+ar[$6,$4]}
     NR>FNR && ar[$4,$1]{print "pre"$1,$2,$3,ar[$4,$1]}' file1 file2 | sort
代码是什么?

  • NR==FNR{…}
    仅适用于第一个输入文件
  • NR>FNR{…}
    在2号、3号,。。。输入文件
  • ar[$5,$3]
    创建一个数组,其键是当前行/记录的第5列和第3列的内容(用字段分隔符分隔;通常为一个空格)

谢谢,这非常接近,但是因为pre3 695到842出现了两次,我希望第4列是21而不是20,你知道如何进行调整吗?谢谢,另外,请你解释一下代码在做什么,我很困惑@F。KnorrI已经添加了一些解释。如果有不清楚的地方,请询问!NR==FNR{…}和NR>FNR{…}除了处理这些文件之外,它们实际上在做什么@F.KnorrNR是记录的编号,FNR代表每个文件中记录的编号。将NR视为读取的总行数,将FNR视为当前输入文件的行号。见:
pre3 695 842 21
pre5 847 881 50
pre8 910 920 1
pre8 695 842 50
pre6 312 430 20
awk 'NR==FNR{ar[$5,$3]=$1+ar[$5,$3]; ar[$6,$4]=$1+ar[$6,$4]}
     NR>FNR && ar[$4,$1]{print "pre"$1,$2,$3,ar[$4,$1]}' file1 file2 | sort