awk - 使用 AWK 修改输出

标签 awk

具有如下所示的数据集,并用 (:) 冒号分隔:

##L1
Advc:start:TA_Wk;TA_Wk:rstb:ver:trstb.techind_C3_D[0].RESETH:LK

##L2
ner:ted:Unused:C1500:ver:sync3rmsfd0nt_t;tape_out:SOCK0

我正在使用列号,并使用 AWK 将一些字符串附加到它。 我试图忽略遇到 # 的 COmments 并最后附加它们。

#!/bin/bash
awk -F: '/^#/ {c=$0; sub(/#+/,"", c); next}
{print $1, "-f" " "$4, "-t" " "$6, "-d" " ""{"$3"}", "-t" " ""{"$7"}","-", "\"" c "\""}' s1

输出:

Advc -f rstb -t trstb.techind_C3_D[0].RESETH -d {TA_Wk;TA_Wk} -t {LK} - "L1"
 -f  -t  -c {} -c {} - "L1"
ner -f C1500 -t sync3rmsfd0nt_t;tape_out -d {Unused} -t {SOCK0} - "L2"

期望的输出:

Advc -f rstb -t trstb.techind_C3_D[0].RESETH -d {TA_Wk;TA_Wk} -t {LK} - "L1"
ner -f C1500 -t sync3rmsfd0nt_t;tape_out -d {Unused} -t {SOCK0} - "L2"

1.在第 3 列和第 7 列中,如果诸如“未使用”、“未指定”之类的单词,则不应打印应忽略的特定列以及附加到其上的字符串,如上面所需输出中所示。

2.如何删除空行。

如何修复我的代码中的上述两个条件(如上所示)?

最佳答案

OP 的尝试修复: 在此修复了 OP 的尝试本身。您需要跳过空行才能正确打印输出,您可以使用简单的 if 条件+我在您的尝试中做了一些微小的更改,例如更改 subgsub删除#部分,设置: BEGIN内节 + 给变量定义明确的名称,以便代替 c我把它改为val为了更好地理解。

awk 'BEGIN{FS=":"} /^$/{next} /^#/ {val=$0; gsub(/#/,"", val); next}
{print $1, "-f" " "$4, "-t" " "$6, \
($3!="Unused"?"-d" " ""{"$3"}":""),\
 ($7!="Unspecified"?"-t" " ""{"$7"}":""),"-", "\"" val "\""
}' s1="\""  Input_file


我尝试解决这个问题:使用 GNU awk 中所示的示例进行编写和测试.

awk '
BEGIN{
 FS=":"
}
/^$/{
  next
}
/^#/{
  val=$0
  gsub(/#/,"", val)
  next
}
{
  ($3=$3!="Unused"?"-d" " ""{"$3"}":"")
  ($7=$7!="Unspecified"?"-t" " ""{"$7"}":"")
  print $1, "-f" " "$4, "-t" " "$6, \
  $3,\
  $7,"-", "\"" val "\""
}' s1="\""  Input_file

关于awk - 使用 AWK 修改输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62414072/

相关文章:

bash - 仅抓取文件所有行中第四个和第七个下划线之间的文本/子字符串

parsing - 使用 shell 脚本解析 csv 行中的名称值对

linux - 包含括号的 awk 协进程的转义序列

bash - 如何打印某些标签之间的数据?

linux - 在 perl 中使用管道 (|) 出现语法错误意外标记

linux - 如何将源文件中的文本复制并粘贴到新文件(仅数字)?

linux - 在 awk 中打印出所有剩余的变量

linux - 将带有空列的行添加到制表符分隔文件

unix - awk 程序按每行的空间比较字段数

bash - 使用 shell 脚本检查字符串是否包含数组元素