当你在Unix中有40个条件时,如何找到OR条件的一部分

时间:2017-10-31 11:12:58

标签: awk

我有一个有40个字段的文件,每个字段应该有特定的长度。我将OR条件设置如下,并检查它是否符合要求并打印任何字段长度超过要求的值。但我想知道并打印哪个字段确切地超出了所需的字段。

命令:

awk -F "|" 'length ($1) > 10 || length ($2) > 30 || length ($3) > 50 || length ($4) > 15 ||...|| length ($40) > 55' /path/filename

3 个答案:

答案 0 :(得分:1)

由于短路,您的现有代码不会在第一次产生的条件之后测试所有条件。如果要全部检查它们,最好将大小要求保持在变量中并循环遍历所有字段,一个例子可以是

$ awk -F'|' -v size="10|30|50..." '
              BEGIN{split(size,s)} 
                   {c=sep=""; 
                    for(i=1;i<=NF;i++)  
                      if(length($i)>s[i]) {c=c sep i; sep=FS}; 
                    if(c) print $0,c}' file

答案 1 :(得分:0)

无需手动编写太多的现场条件。由于您还没有向我们展示预期的输出,因此根据代码编写后的语句。

awk -F"|" '{for(i=1;i<=NF;i++){if(length($i)>40){print i,$i" having more than 40 length"}}}'  Input_file

上面将打印一个字段编号,字段值超过40。

编辑: 在相同的位置添加示例,让我们说以下是Input_file。

cat Input_file
vbrwvkjrwvbrwvbrwv123|vwkjrbvrwnbvrwvkbvkjrwbvbwvwbvrwbvrwbvvbjbvhjrwv|rwvirwvhbrwvbrwvbrwvbhrwbvhjrwbvhjrwbvjrwbvhjwbvhjvbrwvbrwhjvb
123|wwd|wfwcwc

awk -F"|" '{for(i=1;i<=NF;i++){if(length($i)>40){print i,$i" having more than 40 length"}}}' file3499
2 vwkjrbvrwnbvrwvkbvkjrwbvbwvwbvrwbvrwbvvbjbvhjrwv having more than 40 length
3 rwvirwvhbrwvbrwvbrwvbhrwbvhjrwbvhjrwbvjrwbvhjwbvhjvbrwvbrwhjvb having more than 40 length

答案 2 :(得分:0)

这与karakfa的答案基本相同,只是......更多的空白

awk -F "|" '
    BEGIN {
        max[1] = 10
        max[2] = 30
        max[3] = 50
        max[4] = 15
        # ...
        max[40] = 55
    }
    {
        for (i=1; i<=NF; i++) {
            if (length($i) > max[i]) {
                printf "Error: line %d, column %d is wider than %d\n", NR, i, max[i]
            }
        }
    }
' file