如何打印不可预测的字段-awk

如何打印不可预测的字段-awk,awk,Awk,我正试图用awk解析下面的输入。 如果只有3对项目,这意味着如果有ID=34,ID2=35,COL3=“231,输出看起来很好。 但是,项目的数量(ID/ID2/COL3)不同,这就是问题所在 即使项目数量不固定,如何打印所有这些项目 输入 输出 ID=34,ID2=35,COL3="231"#> ID=99,ID2=23># ID=18,ID2=87<# ID=11,ID2=22,COL3="231",COL4="098",#COL5="AAA", ID=34,ID2=35

我正试图用awk解析下面的输入。 如果只有3对项目,这意味着如果有ID=34,ID2=35,COL3=“231,输出看起来很好。 但是,项目的数量(ID/ID2/COL3)不同,这就是问题所在

即使项目数量不固定,如何打印所有这些项目

输入

输出

ID=34,ID2=35,COL3="231"#>
ID=99,ID2=23>#
ID=18,ID2=87<#
ID=11,ID2=22,COL3="231",COL4="098",#COL5="AAA",
ID=34,ID2=35,COL3=“231”#>
ID=99,ID2=23>#
ID=18,ID2=87
ID=99,ID2=23#>
ID=18,ID2=87#<
ID=11,ID2=22,COL3=“231”,COL4=“098”,COL5=“AAA”,COL6=“BBB”#UPD1
第二期望输出

ID=34,ID2=35,COL3="231"#>
ID=99,ID2=23#>
ID=18,ID2=87#<
ID=11,ID2=22,COL3="231",COL4="098",COL5="AAA",COL6="BBB"#UPD1
!#ID=34,ID2=35,COL3="231"#>
!#ID=99,ID2=23#>
!#ID=18,ID2=87#<
@#ID=11,ID2=22,COL3="231",COL4="098",COL5="AAA",COL6="BBB"#UPD1
!#ID=34,ID2=35,COL3=“231”#>
!#ID=99,ID2=23#>
!#ID=18,ID2=87#<
@#ID=11,ID2=22,COL3=“231”,COL4=“098”,COL5=“AAA”,COL6=“BBB”#UPD1

这是一种非常奇怪的格式。我必须(重新)安装GNU Awk(4.1.3)才能获得您看到的输出。BSD(Mac OS X)
Awk
无法识别多字符
RS
值中的
@
-请参见下面的注释

在AICT中,此代码生成您使用GNU Awk查找的输出。它在行的最后一个非空字段前面加上一个
#
标记。将
OFS
设置为空字符串将输出字段,字段之间没有空格

script.awk
运行示例:

$ gawk -f script.awk data
ID=34,ID2=35,COL3="231"#>
ID=99,ID2=23#>
ID=18,ID2=87#<
ID=11,ID2=22,COL3="231",COL4="098",COL5="AAA",COL6="BBB"#UPD1
$
$gawk-f script.awk数据
ID=34,ID2=35,COL3=“231”#>
ID=99,ID2=23#>
ID=18,ID2=87#<
ID=11,ID2=22,COL3=“231”,COL4=“098”,COL5=“AAA”,COL6=“BBB”#UPD1
$
对于同一数据文件,BSD Awk生成:

$ awk -f script.awk data
ID=34,ID2=35,COL3="231"#>
ID=99,ID2=23#>
ID=18,ID2=87<@ID=11,ID2=22,COL3="231",COL4="098",COL5="AAA",COL6="BBB"#UPD1
$
$awk-f script.awk数据
ID=34,ID2=35,COL3=“231”#>
ID=99,ID2=23#>

ID=18,ID2=87我想知道你是否在计算字段、字段分隔符和字段数时被挂断了,这时可能会以不同的方式看待问题

如果您忘记了字段和字段数,并说“如果该行包含大括号,请删除所有空格、大括号、at符号并保存该行,否则使用哈希符号和当前行打印保存的行”,该怎么办

awk'/{/{gsub(/[{}!@]/,”);m=$0;下一个}{print m“#”$0}文件
ID=34,ID2=35,COL3=“231”#>
ID=99,ID2=23#>
ID=18,ID2=87#<
ID=11,ID2=22,COL3=“231”,COL4=“098”,COL5=“AAA”,COL6=“BBB”#UPD1

Great!。我们是否可以同时打印RS(!或@)作为第二个所需的输出?谢谢您的时间。谢谢。您能告诉我如何使用awk脚本执行此操作吗?只需像您自己一样将所有
awk
命令减去单引号放到文件中。好的。非常简单的解决方案。非常感谢。
BEGIN   { FS="[}{[:space:]]+"; RS="!|@"; OFS="" }
NR > 1  {
    # printf "%s%s%s#%s\n", $2, $3, $4, $5;
    for (i = NF; i > 1; i--)
    {
        if ($i != "")
        {
            $i = "#" $i
            break
        }
    }
    print
}
$ gawk -f script.awk data
ID=34,ID2=35,COL3="231"#>
ID=99,ID2=23#>
ID=18,ID2=87#<
ID=11,ID2=22,COL3="231",COL4="098",COL5="AAA",COL6="BBB"#UPD1
$
$ awk -f script.awk data
ID=34,ID2=35,COL3="231"#>
ID=99,ID2=23#>
ID=18,ID2=87<@ID=11,ID2=22,COL3="231",COL4="098",COL5="AAA",COL6="BBB"#UPD1
$
awk '/{/ {gsub(/[ {}!@]/,"");m=$0;next} {print m"#"$0}' file

ID=34,ID2=35,COL3="231"#>
ID=99,ID2=23#>
ID=18,ID2=87#<
ID=11,ID2=22,COL3="231",COL4="098",COL5="AAA",COL6="BBB"#UPD1