awk打印字段中匹配且具有特定值的行

awk打印字段中匹配且具有特定值的行,awk,Awk,在下面的awk中,我试图打印$10=参考标准与$3值匹配的行。我的实际数据是几千行制表符分隔的,因此输入和输出都设置为制表符分隔的。谢谢:) awk awk -F'\t' -v OFS='\t' 'FNR==NR{a[$0];next} $(NF-1)$NF=="referencestandard" && {A[$3];next}$3 in A in a{print}' file awk: cmd. line:1: FNR==NR{a[$0];next} $(NF-1)$NF==

在下面的
awk
中,我试图打印
$10
=
参考标准与
$3
值匹配的行。我的实际数据是几千行
制表符分隔的
,因此输入和输出都设置为
制表符分隔的
。谢谢:)

awk

awk -F'\t' -v OFS='\t' 'FNR==NR{a[$0];next} $(NF-1)$NF=="referencestandard" && {A[$3];next}$3 in A in a{print}' file
awk: cmd. line:1: FNR==NR{a[$0];next} $(NF-1)$NF=="referencestandard" && {A[$3];next}$3 in A in a{print}
awk: cmd. line:1:                                                        ^ syntax error
文件

期望输出

9606    4204    MECP2   NG_007107.2     NM_004992.3     NP_004983.1     reference standard
9606    4204    MECP2   NG_007107.2     NM_001110792.1      NP_001104262.1      reference standard

对于几千行,可能最容易处理两次数据文件(我的名为
data
),在命令行上列出两次。第一次通过时,记录最后一个字段设置为“参考标准”时,
$3
值出现的次数。第二次打印时,将最后一个字段设置为“参考标准”,并且
$3
的出现次数大于
1

awk -F'\t' -v OFS='\t' \
    'FNR == NR && $NF == "reference standard" { a[$3]++; next }
     a[$3] > 1 && $NF == "reference standard" { print }' data data
对于示例数据,我得到的输出是:

9606    4204    MECP2   NG_007107.2     NM_004992.3     NP_004983.1     reference standard
9606    4204    MECP2   NG_007107.2     NM_001110792.1  NP_001104262.1  reference standard
这种技术避免了将文件的整个副本保存在内存中,并避免了其他一些簿记问题。因为您的代码已经有了
FNR==NR
meme,所以我认为您在考虑这些问题,即使您没有在命令行上重复文件名

如果您有能力将整个文件保存在内存中(或者它来自管道而不是文件,因此无法重新扫描),您可以通过以下方式执行此操作:

awk -F'\t' -v OFS='\t' \
    'FNR==NR  && $NF == "reference standard" {
             index = a[$3]++; line[NR] = $0; reps[$3,index] = NR; next
     }
     END {   for (i in a)
                 if (a[i] > 1)
                     for (j = 0; j < a[$3]; j++)
                         print line[reps[i,j]]
     }' data
awk-F'\t'-v OFS='\t'\
“FNR==NR&&$NF==“参考标准”{
索引=a[$3]++;行[NR]=0;重复次数[$3,索引]=NR;下一步
}
结束{for(a中的i)
如果(a[i]>1)
对于(j=0;j

当然,这会产生相同的输出。缺点是,您在内存中有一个完整数据集的副本,加上各种控制数组,因此它使用的内存比两次传递的替代方法多得多。

对于几千行,可能最容易处理两次数据文件(我的称为
data
),在命令行上列出两次。第一次通过时,记录最后一个字段设置为“参考标准”时,
$3
值出现的次数。第二次打印时,将最后一个字段设置为“参考标准”,并且
$3
的出现次数大于
1

awk -F'\t' -v OFS='\t' \
    'FNR == NR && $NF == "reference standard" { a[$3]++; next }
     a[$3] > 1 && $NF == "reference standard" { print }' data data
对于示例数据,我得到的输出是:

9606    4204    MECP2   NG_007107.2     NM_004992.3     NP_004983.1     reference standard
9606    4204    MECP2   NG_007107.2     NM_001110792.1  NP_001104262.1  reference standard
这种技术避免了将文件的整个副本保存在内存中,并避免了其他一些簿记问题。因为您的代码已经有了
FNR==NR
meme,所以我认为您在考虑这些问题,即使您没有在命令行上重复文件名

如果您有能力将整个文件保存在内存中(或者它来自管道而不是文件,因此无法重新扫描),您可以通过以下方式执行此操作:

awk -F'\t' -v OFS='\t' \
    'FNR==NR  && $NF == "reference standard" {
             index = a[$3]++; line[NR] = $0; reps[$3,index] = NR; next
     }
     END {   for (i in a)
                 if (a[i] > 1)
                     for (j = 0; j < a[$3]; j++)
                         print line[reps[i,j]]
     }' data
awk-F'\t'-v OFS='\t'\
“FNR==NR&&$NF==“参考标准”{
索引=a[$3]++;行[NR]=0;重复次数[$3,索引]=NR;下一步
}
结束{for(a中的i)
如果(a[i]>1)
对于(j=0;j

当然,这会产生相同的输出。缺点是,内存中有完整数据集的副本,加上各种控制数组,因此它使用的内存比两次传递方案多得多。

&&
放在
{
?此外,字段编号为
$1
$NF
$0
是整行。从显示的数据来看,“reference”和“standard”之间没有制表符。
FNR==NR
条件意味着文件已被读取、保存,并且不再执行;以下术语永远不会执行,因为没有第二个要读取的文件。您可能可以在
结束
块中执行此操作。不清楚“和
$3
值匹配”是什么意思-它们需要匹配什么?您需要澄清您试图查找的内容。一旦完全描述了需求,就不难执行。
$3
值匹配意味着它们是相同。每个
$3
值可能重复几次,但通常只有一个
$10
值,即
参考标准
。我正在尝试查找文件中不符合该标准的值…即
$3
值相同且
$10
参考标准
。谢谢:)你必须更精确。你是说在
$3
中有两行值相同的不同行吗?不管其他字段中有什么?你想打印两行吗?如果在$3中有三行值相同,你想打印三行还是三对行?在示例数据中,
$3
中的重复也会重复t
$1
$2
中的值(和
$4
)-这有关系吗?只有在
$3
中重复的
$10
值为
参考标准的
才是要保留的行。希望每行的整行不会太多。
$3
中的重复也会在不同的行中。谢谢:)。将
&
放在
之前{
?此外,字段编号为
$1
$NF
$0
是整行。从显示的数据来看,“reference”和“standard”之间没有制表符。
FNR==NR
条件意味着文件已被读取、保存,并且不再执行;以下术语永远不会执行,因为没有第二个要读取的文件。您可能可以在
结束
块中执行此操作。不清楚“和
$3
值匹配”是什么意思-它们需要匹配什么?您需要澄清您试图查找的内容。一旦满足要求,就不难执行此操作