我需要编写Unix脚本循环来处理以下数据的帮助:

200250|Wk50|200212|January|20024|Quarter4|2002|2002
|2003-01-12
|2003-01-18
|2003-01-05
|2003-02-01
|2002-11-03
|2003-02-01|
|2003-02-01|||||||
200239|Wk39|200209|October|20023|Quarter3|2002|2002
|2002-10-27
|2002-11-02
|2002-10-06
|2002-11-02
|2002-08-04
|2002-11-02|
|2003-02-01|||||||

我在文本文件中有上述格式的数据。我需要做的是在所有具有|作为下一行第一个字符的行上删除换行符。我需要的输出是:
200250|Wk50|200212|January|20024|Quarter4|2002|2002|2003-01-12|2003-01-18|2003-01-05|2003-02-01|2002-11-03|2003-02-01||2003-02-01|||||||
200239|Wk39|200209|October|20023|Quarter3|2002|2002|2002-10-27|2002-11-02 |2002-10-06|2002-11-02|2002-08-04|2002-11-02||2003-02-01|||||||

我需要一些帮助来实现这一目标。这些shell命令给我带来了噩梦!

最佳答案

这是一个awk解决方案:

$ awk 'substr($0,1,1)=="|"{printf $0;next} {printf "\n"$0} END{print""}' data

200250|Wk50|200212|January|20024|Quarter4|2002|2002|2003-01-12|2003-01-18|2003-01-05|2003-02-01|2002-11-03|2003-02-01||2003-02-01|||||||
200239|Wk39|200209|October|20023|Quarter3|2002|2002|2002-10-27|2002-11-02|2002-10-06|2002-11-02|2002-08-04|2002-11-02||2003-02-01|||||||

说明:

Awk隐式循环遍历文件中的每一行。
  • substr($0,1,1)=="|"{printf $0;next}
    如果此行以竖线开头,则打印它(不带最后的换行符),然后跳到下一行。与更常见的printf相比,我们在这里使用print,因此除非我们明确要求换行,否则不会打印换行符。
  • {printf "\n"$0}
    如果该行不是以竖线开头,请先打印一个换行符,然后再打印此行(同样没有最终换行符)。
  • END{print""}
    在文件末尾,打印换行符。

  • 细化

    上面在文件的开头打印了一个额外的换行符。如果这是一个问题,那么只需稍作更改就可以消除:
    $ awk 'substr($0,1,1)=="|"{printf $0;next} {printf new $0;new="\n"} END{print""}' data
    200250|Wk50|200212|January|20024|Quarter4|2002|2002|2003-01-12|2003-01-18|2003-01-05|2003-02-01|2002-11-03|2003-02-01||2003-02-01|||||||
    200239|Wk39|200209|October|20023|Quarter3|2002|2002|2002-10-27|2002-11-02|2002-10-06|2002-11-02|2002-08-04|2002-11-02||2003-02-01|||||||
    

    关于shell - 如何合并多行以基于字段分隔符精确地创建两个记录?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25801087/

    10-11 03:46