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 将一些字符串附加到它。我试图忽略遇到的评论 # 并最后附加它们。
#!/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 条件 + 我在您的尝试中做了一些小的更改,例如更改sub
为gsub
删除#
部分,:
在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
推荐阅读
- docker - 通过量角器启动无头 chrome 在 docker 中失败
- cuda - ValueError: Unknown CUDA arch (8.6) or GPU not supported
- javascript - Heroku中的应用程序崩溃/在Localhost中工作
- docker - 如何将带有 docker 日志的目录挂载到 docker 容器
- apache-kafka - Apache Kafka Streams API 与 KSQL
- android - 在主线程中使用过渡动画是应用程序可能在 android 的主线程上做太多工作的原因
- flutter-android - 如何从颤振电话身份验证中删除 reCaptcha
- laravel - 如果我没有退出,为什么 Laravel 会说我退出了?
- java - apache flink中两个以上流的联合
- xml - ANT-APACHE:在 CONCAT 操作期间,每个文件(空白)的终止行被删除了吗?