Shell 在awk中对特定列进行了多值验证?

Shell 在awk中对特定列进行了多值验证?,shell,awk,Shell,Awk,我有一个文本文件,我试图用特定的列(5)验证该列是否包含ACT、LFP、TST和EPO等值,然后该文件将进入进一步的处理,否则它应该退出。这里我的文本文件是否包含第5列中的这些值意味着ACT、LFP,另一方面,TST和EPO进行进一步的处理,若列中包含除这四个值之外的值,那个么脚本将终止 代码 在不进入呼叫系统的情况下,这将向您显示答案 awk -F"~" '{ if (! ($5 == "ACT" || $5 == "LFP" || $5 == "EPO" || $5 == "TST")) p

我有一个文本文件,我试图用特定的列(5)验证该列是否包含ACT、LFP、TST和EPO等值,然后该文件将进入进一步的处理,否则它应该退出。这里我的文本文件是否包含第5列中的这些值意味着ACT、LFP,另一方面,TST和EPO进行进一步的处理,若列中包含除这四个值之外的值,那个么脚本将终止

代码


在不进入呼叫系统的情况下,这将向您显示答案

awk -F"~" '{ if (! ($5 == "ACT" || $5 == "LFP" || $5 == "EPO" || $5 == "TST")) print $0}'  data.txt
输出

161518~CHEM~ACT~IRPMR~**ACT1**~UD
此版本正在测试
$5
是否与列表中的至少一项匹配。如果没有(链式测试前面的
),则它会将记录打印为错误

当然,
$5
一次只匹配该列表中的一个,但这就是您所需要的

相反,当你说

if ($5 != "ACT" || $5 != "LFP" ...)
您正在创建一个永远不可能为真的逻辑测试。如果$5因其为“LFP”而不等于“ACT”,则您已经使链接条件失败,并且剩余的
|
将不会被检查。
IHTH

awk
救援

让我们假设以下输入文件:

010282~CHEM~ACT~IRPMR~ACT~UD
121212~CHEM~ACT~IRPMR~ZZZ~UD
162794~CHEM~ACT~IRPMR~TST~UD
020202~CHEM~ACT~IRPMR~YYY~UD
030767~CHEM~ACT~IRPMR~LFP~UD
987654~CHEM~ACT~IRPMR~EPO~UD
010101~CHEM~ACT~IRPMR~XXX~UD
123456~CHEM~ACT~IRPMR~TST~UD
#!/bin/awk

BEGIN {
    FS = "~"
    s = "ACT,LFP,TST,EPO"
    n = split( s, a, "," )
}

{
    for( i = 1; i <= n; i++ )
        if( a[i] == $5 )
            next

    print "Unexpected value @ line " NR " [" $5 "]"
}

# eof #
#!/bin/awk

BEGIN {
    FS = "~"
    s = "ACT,LFP,TST,EPO"
    n = split( s, a, "," )
}

{
    for( i = 1; i <= n; i++ )
    {
        if( a[i] == $5 )
        {
            print $0
            next
        }
    }
}

# eof #
#!/bin/awk

BEGIN {
    FS = "~"
    s = "ACT,LFP,TST,EPO"
    n = split( s, a, "," )
}

{
    for( i = 1; i <= n; i++ )
        if( a[i] == $5 )
            next

    print $0
}

# eof #
1)此示例说明如何检查输入文件中的无效行/记录:

010282~CHEM~ACT~IRPMR~ACT~UD
121212~CHEM~ACT~IRPMR~ZZZ~UD
162794~CHEM~ACT~IRPMR~TST~UD
020202~CHEM~ACT~IRPMR~YYY~UD
030767~CHEM~ACT~IRPMR~LFP~UD
987654~CHEM~ACT~IRPMR~EPO~UD
010101~CHEM~ACT~IRPMR~XXX~UD
123456~CHEM~ACT~IRPMR~TST~UD
#!/bin/awk

BEGIN {
    FS = "~"
    s = "ACT,LFP,TST,EPO"
    n = split( s, a, "," )
}

{
    for( i = 1; i <= n; i++ )
        if( a[i] == $5 )
            next

    print "Unexpected value @ line " NR " [" $5 "]"
}

# eof #
#!/bin/awk

BEGIN {
    FS = "~"
    s = "ACT,LFP,TST,EPO"
    n = split( s, a, "," )
}

{
    for( i = 1; i <= n; i++ )
    {
        if( a[i] == $5 )
        {
            print $0
            next
        }
    }
}

# eof #
#!/bin/awk

BEGIN {
    FS = "~"
    s = "ACT,LFP,TST,EPO"
    n = split( s, a, "," )
}

{
    for( i = 1; i <= n; i++ )
        if( a[i] == $5 )
            next

    print $0
}

# eof #
2)此示例说明如何从输入文件中筛选(删除)无效行/记录:

010282~CHEM~ACT~IRPMR~ACT~UD
121212~CHEM~ACT~IRPMR~ZZZ~UD
162794~CHEM~ACT~IRPMR~TST~UD
020202~CHEM~ACT~IRPMR~YYY~UD
030767~CHEM~ACT~IRPMR~LFP~UD
987654~CHEM~ACT~IRPMR~EPO~UD
010101~CHEM~ACT~IRPMR~XXX~UD
123456~CHEM~ACT~IRPMR~TST~UD
#!/bin/awk

BEGIN {
    FS = "~"
    s = "ACT,LFP,TST,EPO"
    n = split( s, a, "," )
}

{
    for( i = 1; i <= n; i++ )
        if( a[i] == $5 )
            next

    print "Unexpected value @ line " NR " [" $5 "]"
}

# eof #
#!/bin/awk

BEGIN {
    FS = "~"
    s = "ACT,LFP,TST,EPO"
    n = split( s, a, "," )
}

{
    for( i = 1; i <= n; i++ )
    {
        if( a[i] == $5 )
        {
            print $0
            next
        }
    }
}

# eof #
#!/bin/awk

BEGIN {
    FS = "~"
    s = "ACT,LFP,TST,EPO"
    n = split( s, a, "," )
}

{
    for( i = 1; i <= n; i++ )
        if( a[i] == $5 )
            next

    print $0
}

# eof #
3)此示例说明如何显示输入文件中的无效行/记录:

010282~CHEM~ACT~IRPMR~ACT~UD
121212~CHEM~ACT~IRPMR~ZZZ~UD
162794~CHEM~ACT~IRPMR~TST~UD
020202~CHEM~ACT~IRPMR~YYY~UD
030767~CHEM~ACT~IRPMR~LFP~UD
987654~CHEM~ACT~IRPMR~EPO~UD
010101~CHEM~ACT~IRPMR~XXX~UD
123456~CHEM~ACT~IRPMR~TST~UD
#!/bin/awk

BEGIN {
    FS = "~"
    s = "ACT,LFP,TST,EPO"
    n = split( s, a, "," )
}

{
    for( i = 1; i <= n; i++ )
        if( a[i] == $5 )
            next

    print "Unexpected value @ line " NR " [" $5 "]"
}

# eof #
#!/bin/awk

BEGIN {
    FS = "~"
    s = "ACT,LFP,TST,EPO"
    n = split( s, a, "," )
}

{
    for( i = 1; i <= n; i++ )
    {
        if( a[i] == $5 )
        {
            print $0
            next
        }
    }
}

# eof #
#!/bin/awk

BEGIN {
    FS = "~"
    s = "ACT,LFP,TST,EPO"
    n = split( s, a, "," )
}

{
    for( i = 1; i <= n; i++ )
        if( a[i] == $5 )
            next

    print $0
}

# eof #

希望有帮助

你的i/p文件甚至没有10列?@伊尼亚谢谢,我犯了个错误,现在我已经改正了。你的方法似乎是对的?仅当
if
条件匹配时进行处理很高兴您只使用了5列数据来说明您的问题!;-)祝你好运。awk不是贝壳。awk是一个操作文本的工具,shell是一个调用工具和操作文件/进程的环境。不要尝试使用shell来操纵文本,在这种情况下,不要尝试使用awk来操纵文件。这显然是一个简单的shell命令的工作。哈哈,嘿
awk to the rescue
是注册商标;-)。好东西。