Shell 将awk列值与另一个文件中的列匹配
我需要知道,当我在管道命令中时,是否可以匹配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是否存在于另一个文件的任何列值中(与匹配)。如果
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