如何打印不可预测的字段-awk
我正试图用awk解析下面的输入。 如果只有3对项目,这意味着如果有ID=34,ID2=35,COL3=“231,输出看起来很好。 但是,项目的数量(ID/ID2/COL3)不同,这就是问题所在 即使项目数量不固定,如何打印所有这些项目 输入 输出如何打印不可预测的字段-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
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