Shell 将awk列值与另一个文件中的列匹配

Shell 将awk列值与另一个文件中的列匹配,shell,awk,associative-array,pipeline,Shell,Awk,Associative Array,Pipeline,我需要知道,当我在管道命令中时,是否可以匹配awk值。如下图所示: somebinaryGivingOutputToSTDOUT | grep -A3 "sometext" | grep "somemoretext" | awk -F '[:|]' 'BEGIN{OFS=","; print "Col1,Col2,Col3,Col4"}{print $4,$6,$4*10^10+$6,$8}' 从这里,我需要检查计算值$4*10^10+$6是否存在于另一个文件的任何列值中(与匹配)。如果

我需要知道,当我在管道命令中时,是否可以匹配awk值。如下图所示:

  somebinaryGivingOutputToSTDOUT |  grep -A3 "sometext" | grep "somemoretext" | awk -F '[:|]' 'BEGIN{OFS=","; print "Col1,Col2,Col3,Col4"}{print $4,$6,$4*10^10+$6,$8}'
从这里,我需要检查计算值
$4*10^10+$6
是否存在于另一个文件的任何列值中(与匹配)。如果有,请打印,否则请继续

需要匹配值的文件如下所示:

a,b,c,d,e
1,2,30000000000,3,4
我需要匹配上述文件的第3列

理想情况下,我希望这是在同一个命令中,因为如果不应用此检查,它将打印超过1亿行(和一个大文件)

我已经读过了

添加更多信息: 把我的命令分解成几个部分 第1部分命令:

 somebinaryGivingOutputToSTDOUT |  grep -A3 "sometext" | grep "Something:"
第1部分输出(仅显示1个迭代输出):

第2部分命令现在我使用awk

awk -F '[:|]' 'BEGIN{OFS=","; print "Col1,Col2,Col3,Col4"}{print $4,$6,$4*10^10+$6,$8}'
第2部分命令输出:当前打印以下值(请参见我如何乘以
1*10^10+10588429
和获得
10010588429

1,10588429,10010588429,1491539456372358463
3,12394810,30012394810,1491539456372359082
1,10588430,10010588430,1491539456372366413
现在,我需要在命令[near awk]中设置一个复选框,以便仅当10010588429出现在另一个文件中时(比如下面的另一个_file.csv)才打印

输出应仅为

1,10588429,10010588429,1491539456372358463
1,10588430,10010588430,1491539456372366413

因此,对于awk的每一行,我们检查file2列C中的条目。您可以通过管道将
grep
awk
输出导入一个
,同时读取
循环,这给了您一定的自由度。您可以决定是否转发一行:

grep -A3 "sometext" | grep "somemoretext" | while read LINE; do
    COMPUTED=$(echo $LINE | awk -F '[:|]' 'BEGIN{OFS=","}{print $4,$6,$4*10^10+$6,$8}')
    if grep $COMPUTED /the/file/to/search &>/dev/null; then
        echo $LINE
    fi
done | cat -

我将发布一个模板,你可以利用它进行计算

awk 'BEGIN   {FS=OFS=","}
     NR==FNR {lookup[$3]; next} 
  /sometext/ {c=4} 
 c&&c--&&/somemoretext/ {value= # implement your computation here
                         if(value in lookup) 
                             print "what you want"}' lookup.file FS=':' grep.files...
这里
awk
将第一个文件第三列中的值(以逗号分隔)加载到查找数组(伪装的哈希映射)中。对于下一组文件,将分隔符设置为
,类似于
grep-A3
在第一个图案的3个距离内查找第二个图案,进行计算并打印所需内容

awk
中,您还可以对模式匹配的列进行更多控制,这里我复制了
grep
示例

这是另一个关注问题核心的简化示例

awk 'BEGIN{for(i=1;i<=1000;i++) print int(rand()*1000), rand()}' | 
awk 'NR==FNR{lookup[$1]; next} 
     $1 in lookup' perfect.numbers -  
用于查找文件

$ head perfect.numbers
6
28
496
8128

使用前面问题中的关联数组方法,将管道数据替换为
-

处的第二个文件,在第一个文件中包含连字符,以将AWK定向到输入流

例如:

grep -A3 "sometext" | grep "somemoretext" | awk -F '[:|]'
    'BEGIN{OFS=","; print "Col1,Col2,Col3,Col4"} 
     NR==FNR {
         query[$4*10^10+$6]=$4*10^10+$6;  
         out[$4*10^10+$6]=$4 FS $6 FS $4*10^10+$6 FS $8; 
         next
     } 
     query[$3]==$3 {
         print out[$3]
     }' - another_file.csv > output.csv
有关合并过程的更多信息,请参见问题中引用的答案:


如果您提供了示例输入文件和预期输出,则会更好…您知道您也可以使用
awk
实现
grep
功能吗?如果第二个查找文件较小(与内存相比),您可以读入数组并进行快速查找。@要查找的karakfa yes文件很小,最大值为1000lines@Sundeep完成!这很有帮助,但是在grep+awk组合之前包含输入样本会更完整…考虑到整个问题而不是中间方法,使用单个awk命令可能会更容易完成一切谢谢。这是一个二进制文件这就是打印到stdout,我grep和pipe它不是从grep文件创建一个密钥吗?(我基本上是从进程grep stdout)。如果是这种情况,它将有内存问题,因为它将非常大。意图是每次在决定打印或不打印grepped流之前将较小的文件条目进行grepped。我希望我的解释足够清楚。谢谢。永远不要这样做。请看一些原因。还有谷歌不带引号的变量,所有大写的变量名,UOOC,。。。
28 0.736027
496 0.968379
496 0.404218
496 0.151907
28 0.0421234
28 0.731929
$ head perfect.numbers
6
28
496
8128
grep -A3 "sometext" | grep "somemoretext" | awk -F '[:|]'
    'BEGIN{OFS=","; print "Col1,Col2,Col3,Col4"} 
     NR==FNR {
         query[$4*10^10+$6]=$4*10^10+$6;  
         out[$4*10^10+$6]=$4 FS $6 FS $4*10^10+$6 FS $8; 
         next
     } 
     query[$3]==$3 {
         print out[$3]
     }' - another_file.csv > output.csv