使用&#;; awk'处理文件或任何其他命令

时间:2014-12-08 18:22:35

标签: shell

我有一个类似的文件:

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'来完成。命令。请帮助我。

3 个答案:

答案 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