AWK Multilines成单行记录

时间:2014-04-13 04:12:31

标签: 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","
#}

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

4 个答案:

答案 0 :(得分:2)

试试这个awk

awk -F"\n" -v RS="</EmployeeData>" '{$1=$1}1' file
01 | 0101001001 | DD-01-001-001-001/57 | 1 | Vijay Raghavan |  | 3096 | Govind Industries |  |  |  |  |  |  |  |

如果你喜欢,作为分隔符:

awk -F"\n" -v RS="</EmployeeData>" '{$1=$1;gsub(/ \| /,",")}1' file
01,0101001001,DD-01-001-001-001/57,1,Vijay Raghavan,,3096,Govind Industries,,,,,,,,

答案 1 :(得分:2)

 awk -v RS="" '{$1=$1}7'  file

上述行会将所有行合并为一行,包括</EmployeeData>

答案 2 :(得分:1)

有几个潜在的问题。首先,使用的RS的值与它想要匹配的文本不匹配(这就是没有输出的原因)。其次,print会自动将换行符放在它打印的文本的末尾,因此无论如何输出都会在多行上。

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

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

答案 3 :(得分:0)

#是awk comment-start字符。发布的.awk文件中的每一行都被注释掉,因此没有输出。此外,RS="[</EmployeeData>]"未将RS设置为字符串</EmployeeData>,因为我怀疑是需要的,它将其设置为列表< / E m p l o y e D a t中的任何字符,由字符列表分隔符{{[]提供1}}。

我认为这可能是你真正想要的(使用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>

$ 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,,,