我给了一个csv文件,其中包含类似
的记录1. abc^123-01^NA^xyz 70
%^11-Sep-12^15-Apr-08^M
2. def^345^NA^NAME^01/10/2006^04/01/2007^M
3. ghi^234-01^NA^company 70
%^19-Oct-20^04-Jun-07^M
4. jkl^72403831^NA^Org^13-Mar-11^26-Mar-08^M
5. 3251^2345^NA^SOLN., 10
%^31-Dec-20^01-Apr-07^M
我使用“ od -c file”检查了文件,并且第1、3和5行末尾的字符为\ n。在Hex编辑器中再次检查了它是OA。提取此文件后,无论第1、3和5行中的换行出现在何处,记录都会被截断。
我尝试使用tr -delete'\ n'删除所有新行,这使我在下面:tr --delete
abc^123-01^NA^xyz 70%^11-Sep-12^15-Apr- 08^Mdef^345^NA^NAME^01/10/2006^04/01/2007^Mghi^234-01^NA^company 70%^19-Oct-20^04-Jun-07^Mjkl^72403831^NA^Org^13-Mar-11^26-Mar-08^M3251^2345^NA^SOLN., 10%^31-Dec-20^01-Apr-07^M
我正在尝试在^ M字符处插入换行符以正确获取我的行。任何人都可以就如何实现这一目标提出任何想法。 我在下面尝试过:
tr '^M' '^M\n' <file
sed 's/^M/\n/g' file
以上所有工作均未完成。我对awk不太熟悉,但是也在检查awk。我希望听到有关实现此目的的想法。
谢谢!
答案 0 :(得分:0)
你去...
$ tr -d '\n' <file | tr '\r' '\n'
1. abc^123-01^NA^xyz 70 %^11-Sep-12^15-Apr-08
2. def^345^NA^NAME^01/10/2006^04/01/2007
3. ghi^234-01^NA^company 70 %^19-Oct-20^04-Jun-07
4. jkl^72403831^NA^Org^13-Mar-11^26-Mar-08
5. 3251^2345^NA^SOLN., 10 %^31-Dec-20^01-Apr-07
删除换行符,然后用换行符替换cr。多余的空间在您的文件中...
对于文字^M
而非\r
表示形式,您可以使用sed 's/\^M//'
例如:
$ echo "here goes^M" | sed 's/\^M//'
here goes
答案 1 :(得分:0)
听起来您的输入文件仅使用\r\n
(CR-LF)作为换行字符串,而不仅仅是\n
(LF),并且这些行可以包含\n
。这对于Windows中生成的文件非常普遍。这是将它们转换为UNIX中没有\n
中线的\n
换行符的一种方法,对多字符RS使用GNU awk:
$ cat -v file
1. abc^123-01^NA^xyz 70
%^11-Sep-12^15-Apr-08^M
2. def^345^NA^NAME^01/10/2006^04/01/2007^M
3. ghi^234-01^NA^company 70
%^19-Oct-20^04-Jun-07^M
4. jkl^72403831^NA^Org^13-Mar-11^26-Mar-08^M
5. 3251^2345^NA^SOLN., 10
%^31-Dec-20^01-Apr-010^M
$ awk -v RS='\r\n' '{gsub(/\n/,"")}1' file
1. abc^123-01^NA^xyz 70 %^11-Sep-12^15-Apr-08
2. def^345^NA^NAME^01/10/2006^04/01/2007
3. ghi^234-01^NA^company 70 %^19-Oct-20^04-Jun-07
4. jkl^72403831^NA^Org^13-Mar-11^26-Mar-08
5. 3251^2345^NA^SOLN., 10 %^31-Dec-20^01-Apr-010
或也删除每个\n
周围的空格:
$ awk -v RS='\r\n' '{gsub(/\s*\n\s*/,"")}1' file
1. abc^123-01^NA^xyz 70%^11-Sep-12^15-Apr-08
2. def^345^NA^NAME^01/10/2006^04/01/2007
3. ghi^234-01^NA^company 70%^19-Oct-20^04-Jun-07
4. jkl^72403831^NA^Org^13-Mar-11^26-Mar-08
5. 3251^2345^NA^SOLN., 10%^31-Dec-20^01-Apr-010
并访问每个记录中的每个字段:
$ awk -v RS='\r\n' -F'^' '{gsub(/\s*\n\s*/,""); print; for (i=1;i<=NF;i++) print "\t"i, $i}' file
1. abc^123-01^NA^xyz 70%^11-Sep-12^15-Apr-08
1 1. abc
2 123-01
3 NA
4 xyz 70%
5 11-Sep-12
6 15-Apr-08
2. def^345^NA^NAME^01/10/2006^04/01/2007
1 2. def
2 345
3 NA
4 NAME
5 01/10/2006
6 04/01/2007
3. ghi^234-01^NA^company 70%^19-Oct-20^04-Jun-07
1 3. ghi
2 234-01
3 NA
4 company 70%
5 19-Oct-20
6 04-Jun-07
4. jkl^72403831^NA^Org^13-Mar-11^26-Mar-08
1 4. jkl
2 72403831
3 NA
4 Org
5 13-Mar-11
6 26-Mar-08
5. 3251^2345^NA^SOLN., 10%^31-Dec-20^01-Apr-010
1 5. 3251
2 2345
3 NA
4 SOLN., 10%
5 31-Dec-20
6 01-Apr-010
$