如果行数大于N,则打印整个变量内容

时间:2017-04-12 09:18:15

标签: awk

如果某些条件匹配,如何打印所有行。

示例:

echo "$ip"
this is a sample line
another line
one more
last one

如果此文件超过3行,则打印整个变量。

I am tried:

echo $ip| awk 'NR==4' 
last one
echo $ip|awk 'NR>3{print}' 
last one

echo $ip|awk 'NR==12{} {print}' 
this is a sample line
another line
one more
last one

echo $ip| awk 'END{x=NR} x>4{print}' 

需要实现这一目标:

如果此文件超过3行,则打印整个文件。我可以使用wcbash执行此操作,但需要一个班轮。

3 个答案:

答案 0 :(得分:3)

正确的方法(没有回声,没有管道,没有循环等):

$ awk -v ip="$ip" 'BEGIN{if (gsub(RS,"&",ip)>2) print ip}'
this is a sample line
another line
one more
last one

答案 1 :(得分:2)

您可以按照以下方式使用Awk

echo "$ip" | awk '{a[$0]; next}END{ if (NR>3) { for(i in a) print i }}'
one more
another line
this is a sample line
last one

您还可以从3变量

中配置值awk
echo "$ip" | awk -v count=3 '{a[$0]; next}END{ if (NR>count) { for(i in a) print i }}'

我们的想法是在处理每一行时将每行的内容存储在{a[$0]; next}中,到达END子句时,NR变量将具有该行你拥有的字符串/文件的数量。如果条件匹配,则打印行,即大于 3的行数或使用的任何可配置值。

并且始终记得在bash中引用变量以避免在shell中进行单词分割。

使用下面的James Brown's有用评论来保留行的顺序,请执行

echo "$ip" | awk -v count=3 '{a[NR]=$0; next}END{if(NR>3)for(i=1;i<=NR;i++)print a[i]}'
this is a sample line
another line
one more
last one

答案 2 :(得分:1)

awk中的另一个人。第一个测试文件:

$ cat 3
1
2
3
$ cat 4
1
2
3
4

代码:

$ awk 'NR<4{b=b (NR==1?"":ORS)$0;next} b{print b;b=""}1' 3  # look ma, no lines
  [this line left intentionally blank. no wait!]
$ awk 'NR<4{b=b (NR==1?"":ORS)$0;next} b{print b;b=""}1' 4
1
2
3
4

说明:

NR<4 {                     # for tghe first 3 records
    b=b (NR==1?"":ORS) $0  # buffer them to b with ORS delimiter
    next                   # proceed to next record
} 
b {                        # if buffer has records, ie. NR>=4
    print b                # output buffer
    b=""                   # and reset it
}1                         # print all records after that