从awk脚本中的变量字符串中删除最后一行

时间:2014-10-08 19:11:08

标签: linux bash awk

我制作了以下剧本:

awk ' {
  if ($1 ~ /^d/) {
   a=a $0; 
  }
  .... -> rest code
  if (p == 1) {
    b=a;
    print b;
  }
} ' input.txt
  • a - 存储找到的结果,我稍后会用它来工作,所以不能改变它的结构
  • b - 存储a的一部分,如标题

输入文件:

      d1file some text
      edont show that
      d2file like it
      d3file need to remove

结尾的内容:

      d1file some text
      d2file like it
      d3file need to remove

我想做什么:

如果 $ 1 d 开头,我会将其存储在 a 变量中。后来我想将 a 移到 b 并从 b 中移除最后一行,因此 b 的输出应为:

      d1file some text
      d2file like it

我正在寻找任何解决方案,但根本没有运气。我正在考虑将 a 内容存储为数组并使用index-1将其循环以删除最后一行,但我无法使其工作。

有没有办法做到这一点?

5 个答案:

答案 0 :(得分:2)

这应该做的工作:

awk 'BEGIN {counter=1} { if ($1 ~ /^d/) array[counter++]=$0} END { for (element=1;element<counter-1;element++) print array[element]}' input.txt

这会将所有搜索命中数放入数组中,然后在最后打印除数组的最后一个元素之外的所有内容

答案 1 :(得分:1)

awk '
  /^d/ { a = a $0 "\n"}          # accumulate lines starting with d
  END {
    sub(/\n[^\n]*\n$/, "", a);   # remove the last line
    print a
  }
' input.txt

答案 2 :(得分:1)

您可以使用这个简单的awk命令:

awk '$1 ~ /^d/{if(p) a=a p; p=$0 ORS} END{printf a}' input.txt
d1file some text
d2file like it

答案 3 :(得分:0)

awk '/^d/{a[nr++]=$0}END{for(i=0;i<nr-1;i++) print a[i]}'input.txt

/^d/选择以d开头的行,如果以a

开头,执行操作会保存数组d中的行

for中的END将打印排除最后一个

的数组

答案 4 :(得分:0)

我不明白这里的最终目标,这似乎是一种奇怪的做事方式,但这应该做你想做的事情:

awk 'tmp{b=b (b?ORS:"") tmp; tmp=""}; /^d/{tmp=$0;next} END{a=b (tmp?ORS:"") tmp; ...do something with a and b here...} input.txt

示例:

$ cat input.txt
d1file some text
edont show that
d2file like it
d3file need to remove
$ awk 'tmp{b=b (b?ORS:"") tmp; tmp=""}; /^d/{tmp=$0;next} END{a=b (tmp?ORS:"") tmp; print "--"; print a; print "--"; print b; print "--"}' input.txt
--
d1file some text
d2file like it
d3file need to remove
--
d1file some text
d2file like it
--