我有一个有40个字段的文件,每个字段应该有特定的长度。我将OR条件设置如下,并检查它是否符合要求并打印任何字段长度超过要求的值。但我想知道并打印哪个字段确切地超出了所需的字段。
命令:
awk -F "|" 'length ($1) > 10 || length ($2) > 30 || length ($3) > 50 || length ($4) > 15 ||...|| length ($40) > 55' /path/filename
答案 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