我有一个类似的文件:
Data:
1,2,3
Message
Data:
3,4,5
Message error
Error Due to data type mismatch
Data:
5,6,7
Message done
这里我输入文件中有10条记录。我想根据字符串' Data:'在输出文件中获得3条记录。 我想要的输出文件是:
Data:|1,2,3|Message
Data:|3,4,5|Message error|Error Due to data type mismatch
Data:|5,6,7|Message done
我认为这可以通过' awk'来完成。命令。请帮助我。
答案 0 :(得分:1)
sed
+ tr
有一种方法:
tr \\n \| | sed 's/|\($\|Data\)/\n\1/g;'
这
Data:
1,2,3
Message
Data:
3,4,5
Message error
Error Due to data type mismatch
Data:
5,6,7
Message done
这将呈现:
Data:|1,2,3|Message
Data:|3,4,5|Message error|Error Due to data type mismatch
Data:|5,6,7|Message done
bash
pot=""
while read line ;do
[ "$line" ] && [ -z "${line%Data:}" ] &&
[ "$pot" ] && echo "${pot% | }" && pot=""
pot+="$line | "
done
echo "${pot% | }"
将呈现:
Data: | 1,2,3 | Message
Data: | 3,4,5 | Message error | Error Due to data type mismatch
Data: | 5,6,7 | Message done
perl
方式之一perl -nE 'chomp;if(/Data/){say$l if$l;$l=$_}else{$l.="|".$_};END{say$l}'
Data:|1,2,3|Message
Data:|3,4,5|Message error|Error Due to data type mismatch
Data:|5,6,7|Message done
但是你可以用许多不同的方式做同样的事情!
sed
!sed '/Data/ba;${H;ba;};bb;:a;x;s/\n/|/g;/./p;s/.*//;x;:b;/^Data/h;/^Data/!H;;d'
将呈现:
Data:|1,2,3|Message
Data:|3,4,5|Message error|Error Due to data type mismatch
Data:|5,6,7|Message done
太...
答案 1 :(得分:1)
使用GNU awk
awk -F '\n' -vOFS='|' -vRS='Data:' '/./{NF--; printf "%s%s\n", p,$0};{p=RT}' file
Data:|1,2,3|Message
Data:|3,4,5|Message error|Error Due to data type mismatch
Data:|5,6,7|Message done
或者更一般地说
awk 'BEGIN{z=getline n < ARGV[1]};
{z=getline n < FILENAME; printf "%s%s", $0, n ~ /Data/ || !z? "\n": "|"}' file
Data:|1,2,3|Message
Data:|3,4,5|Message error|Error Due to data type mismatch
Data:|5,6,7|Message done
答案 2 :(得分:0)
这会留下尾随'|',但这很容易解决:
awk '/^Data:/ && NR>1 {printf "\n"}1' ORS=\| input; echo