我制作了以下剧本:
awk ' {
if ($1 ~ /^d/) {
a=a $0;
}
.... -> rest code
if (p == 1) {
b=a;
print b;
}
} ' input.txt
输入文件:
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将其循环以删除最后一行,但我无法使其工作。
有没有办法做到这一点?
答案 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
--