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

Awk 如果行数大于N,则打印整个变量内容,awk,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 anot

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

例如:

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行,则打印整个文件。我可以使用
wc
bash
来实现这一点,但需要一个内衬

您可以按如下方式使用
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
您还可以通过
awk
变量配置值
3

echo "$ip" | awk -v count=3 '{a[$0]; next}END{ if (NR>count) { for(i in a) print i }}'
其思想是将每一行的内容存储在
{a[$0];下一行}
处理每一行时,当到达
END
子句时,
NR
变量将具有您拥有的字符串/文件的行数。如果条件匹配,即行数大于
3
或使用任何可配置值,则打印行

并始终记住在
bash
中双引号引用变量,以避免shell进行分词


使用下面有用的注释来保留行的顺序,请执行以下操作

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

echo“$ip”| awk-v count=3'{a[NR]=0;next}END{if(NR>3)for(i=1;iawk中的另一个。第一个测试文件:

$ cat 3
1
2
3
$ cat 4
1
2
3
4
代码:

$awk'NR正确的方法(无回声、无管道、无环路等):


(a中的i)的
不以原始顺序而是以随机顺序()生成输出;i@JamesBrown:更新!谢谢!如果你比我先回答,我的
awk
答案的80%将不被接受;):-).老实说,我真不明白为什么人们一听到第一个答案就跳起来,而不是花时间去看看他们会得到什么其他答案。你会惊讶地发现,有多少次(不是这次)我看到一个被接受的答案,并认为“天哪,这是个定时炸弹!”但我不能每次都浪费时间发表评论和/或附加答案(除非是像这样琐碎的事情)因为我的感觉是在接受了一个答案后,OP通常会继续前进,其他人在将来看到它时通常会认为接受的答案是他们也应该采纳的答案。
$ 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
$ awk -v ip="$ip" 'BEGIN{if (gsub(RS,"&",ip)>2) print ip}'
this is a sample line
another line
one more
last one