根据模式

时间:2018-08-17 18:54:17

标签: awk sed tr

我给了一个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 file1

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。我希望听到有关实现此目的的想法。

谢谢!

2 个答案:

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