如果行数小于2,则删除到下一个换行值

时间:2017-09-23 16:38:25

标签: batch-file awk

我有一个类似的文件:

> DC
A P C
Q Z C
D H C
> DS
J H S
> DA
U P A
A E A
U H A

如果两个换行值(>)之间的行数小于例如,则我想删除部分。所以我的例子的解决方案是:

> DC
A P C
Q Z C
D H C
> DA
U P A
A E A
U H A

6 个答案:

答案 0 :(得分:2)

使用>作为记录分隔符:

gawk -v RS='>' -v nlines=2 '
    {sub(/\n$/,"");  n = split($0,a,/\n/)}
    n > nlines {print RS $0}
' file

答案 1 :(得分:1)

2017-10-27 22:38:18 DEBUG TestBugs:58 - Duplicate,  [Point [x=-97.009868, y=52.358242]] index[15]
2017-10-27 22:38:18 DEBUG TestBugs:58 - Duplicate,  [Point [x=-97.009868, y=52.358242]] index[3348]

答案 2 :(得分:0)

使用awk,根据您的需要修改变量值n=<of your interest>,其中n是两个>之间的最小记录数

一衬垫:

awk -v n=2 'function pr(){if(i>=n)print s}/>/{pr();i=0;s=$0;next}{i++;s=s ORS $0}END{pr()}' infile

更好的可读性:

awk -v n=2 '
            function pr(){
                 if(i>=n)print s; 
            }
            />/{
                 pr();
                 i = 0
                 s = $0
                 next
            }
            {
              i++;
              s = s ORS $0
            }
         END{
              pr()
            }
           ' infile

输入:

$ cat infile
> DC
A P C
Q Z C
D H C
> DS
J H S
> DA
U P A
A E A
U H A

输出:

$ awk -v n=2 'function pr(){if(i>=n)print s}/>/{pr();i=0;s=$0;next}{i++;s=s ORS $0}END{pr()}' infile
> DC
A P C
Q Z C
D H C
> DA
U P A
A E A
U H A

答案 3 :(得分:0)

你能不能试试,请告诉我这是否对你有帮助。

awk 'count>3 && /^>/{print val;val=""} /^>/{count=count?"":++count;val=""} {count++;val=val?val ORS $0:$0} END{if(count>3){print val}}'  Input_file

现在也添加非单线形式的解决方案。

awk '
count>3 && /^>/{
  print val;
  val=""
}
/^>/{
  count=count?"":++count;
  val=""
}
{
  count++;
  val=val?val ORS $0:$0
}
END{
  if(count>3){
    print val
}
}
'   Input_file

输出如下。

> DC
A P C
Q Z C
D H C
> DA
U P A
A E A
U H A

答案 4 :(得分:0)

GNU awk的另一个:

$ awk 'BEGIN{RS=">"}/([^\n]*\n){3}/{printf RS $0}' file
> DC
A P C
Q Z C
D H C
> DA
U P A
A E A
U H A

(虽然没有经过彻底的测试。)

答案 5 :(得分:0)

awk -F"\n" 'BEGIN{RS=">";ORS=">";} NF<=3 && NR>1{next;}1' file