将多行AWK转换为单行记录

将多行AWK转换为单行记录,awk,Awk,以下数据必须转换为字符串 01 | 0101001001 | DD-01-001-001-001/57 | 1 | Vijay Raghavan | | 3096 | Govind Industries | | | | | | | | </EmployeeData> 使用.awk文件中的以下代码: #BEGIN {FS ="\n" ; RS="[</EmployeeData>]"} #{ #for (i=1; i<=NF; i++) #print $i

以下数据必须转换为字符串

01 | 0101001001 | DD-01-001-001-001/57 | 1 | Vijay Raghavan | | 3096 | Govind Industries | | | | | | | | </EmployeeData> 使用.awk文件中的以下代码:

#BEGIN {FS ="\n" ; RS="[</EmployeeData>]"}
#{
#for (i=1; i<=NF; i++)
#print $i","
#}

没有输出。请帮忙。提前谢谢

有几个潜在的问题。首先,使用的RS值与它要匹配的文本不匹配,这就是没有输出的原因。第二,print会自动在打印的文本末尾添加一个换行符,因此输出将是多行的

以下脚本解决了这两个问题:

BEGIN {FS ="\n" ; RS="</EmployeeData>"}
{ 
    for (i=1; i<=NF; i++)
        printf "%s,",$i;
    printf "\n";
}

有几个潜在的问题。首先,使用的RS值与它要匹配的文本不匹配,这就是没有输出的原因。第二,print会自动在打印的文本末尾添加一个换行符,因此输出将是多行的

以下脚本解决了这两个问题:

BEGIN {FS ="\n" ; RS="</EmployeeData>"}
{ 
    for (i=1; i<=NF; i++)
        printf "%s,",$i;
    printf "\n";
}
试试这个awk

试试这个awk

上面的行将所有行合并为一行,包括

上面的行将把所有行合并为一行,包括是awk注释开始字符。post.awk文件中的每一行都被注释掉,因此没有输出。而且,RS=[]并没有像我怀疑的那样将RS设置为字符串,而是将其设置为列表中的任何字符 我认为这可能是您真正想要的使用GNU awk进行多字符RS:

$ cat file
01 |
0101001001 |
DD-01-001-001-001/57 |
1 |
Vijay Raghavan |
 |
3096 |
Govind Industries |
 |
 |
  </EmployeeData>
02 |
0202002002 |
DD-01-001-001-001/57 |
1 |
Bob Shmobswort |
 |
1234 |
Some Other Places |
 |
 |
  </EmployeeData>
是awk注释的开始字符。post.awk文件中的每一行都被注释掉,因此没有输出。而且,RS=[]并没有像我怀疑的那样将RS设置为字符串,而是将其设置为列表中的任何字符 我认为这可能是您真正想要的使用GNU awk进行多字符RS:

$ cat file
01 |
0101001001 |
DD-01-001-001-001/57 |
1 |
Vijay Raghavan |
 |
3096 |
Govind Industries |
 |
 |
  </EmployeeData>
02 |
0202002002 |
DD-01-001-001-001/57 |
1 |
Bob Shmobswort |
 |
1234 |
Some Other Places |
 |
 |
  </EmployeeData>

它给出了一个无效的字符错误*我在Windows中工作。此外,在EmployeeData行中有一些前导空格…这不是在awk中执行此工作的方式。请参阅Kent&Jotne&我自己发布的其他答案,以获得更好的起点。请注意,任何将RS设置为超过1个字符的解决方案都是GNU awk特定的。它给出了一个无效字符错误*我在Windows中工作。此外,在EmployeeData行中有一些前导空格…这不是在awk中执行此工作的方式。请参阅Kent&Jotne&我自己发布的其他答案,以获得更好的起点。请注意,任何将RS设置为大于1个字符的解决方案都是特定于GNU awk的。
$ cat file
01 |
0101001001 |
DD-01-001-001-001/57 |
1 |
Vijay Raghavan |
 |
3096 |
Govind Industries |
 |
 |
  </EmployeeData>
02 |
0202002002 |
DD-01-001-001-001/57 |
1 |
Bob Shmobswort |
 |
1234 |
Some Other Places |
 |
 |
  </EmployeeData>
$ cat tst.awk
BEGIN{FS="[[:space:]]*[|][[:space:]]*"; OFS=","; RS="</EmployeeData>[[:space:]]*"}
{ $1=$1; print }
$ awk -f tst.awk file
01,0101001001,DD-01-001-001-001/57,1,Vijay Raghavan,,3096,Govind Industries,,,
02,0202002002,DD-01-001-001-001/57,1,Bob Shmobswort,,1234,Some Other Places,,,