我需要编写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/