【发布时间】:2014-07-29 20:36:58
【问题描述】:
我正在尝试使用 awk 动态打印文件的选定字段。
基本上,问题是为什么这个有效:
awk -F';' '{print $3 ";" $4 ";" }' file
但事实并非如此:
awk -F';' '{print '`echo '$3 ";" $4 ";"'`' }' file
我的最终目标是将上述内容封装在一个命令中,以便我能够做到
my_cmd ';' 3 6 7 8 file(s)
它应该显示由; 与file(s) 分隔的字段#3,6,7,8。
编辑我的帖子: 自己发现我的问题是回声当然是插入了一个新行字符,这导致 awk 出现问题:o) \c 成功了,还有一些 \" 转义必须做(见下文)。
awk -F';' '{print '"`echo '$3 \";\" $4 \";\"\c'`"' }' file(s)
现在我只剩下用命令来更改它了,该命令将生成一个类似的字符串
$2 ";' $5 ";' $6 ";' $9 ";"(数字和字段应该是输入)等应该介于'{print '和' }'之间
感谢 cbuckley,我发现了我的单行命令:(问题已解决)。
cut -d"$1" -f `shift; echo $* | sed 's/[^ 0-9]\{1,\}.*$//;s/[ ]$//;s/[ ]\{1,\}/,/g'` `shift; printf "%s\n" $(echo $*) | grep -v '^[0-9]$'`
这里 $* 是输入参数,如果上面将作为别名或函数在名为 say filterc 的 .rc 文件中,那么 synopsys 将是:
filterc delimiter column1 [column2 [column3...]] file1 [file2 [file3...]]
地点:
分隔符 - 仅一个字符
column1..n - 代表列的数字
file1..n - 要过滤的文件,这里假设文件没有来自 仅数字,并且所有格式都相同。
【问题讨论】:
-
echo和反向波浪号在 awk 中没有任何意义。你应该更好地解释你想要做什么? -
要将 shell 变量传递给
awk,您需要使用-v参数。见stackoverflow.com/questions/6373379/using-awk-with-variables -
测试你做了什么:
echo '{print ...}'(血腥的语法高亮不让我写完整的代码) -
感谢大家的意见。看起来自己发现了问题所在: echo 在执行后添加了一个 \n ,导致行中断:} 不存在以关闭 awk 的语句。还必须进行一些调整才能最终使其正常工作 awk -F';' '{print '"
echo '$3 \";\" $4 \";\"\c'"' }' -
在给定特定样本输入集的情况下产生所需输出的软件是寻找解决方案的起点。这不一定是一个好的解决方案。在这种情况下,您至少会接受不一致的回显实现,可能会扩展为导致奇怪错误的 awk 代码的参数,复杂的引用问题,潜在的通配符和分词问题等。当您使用时,这都是 100% 不必要的可以简单地向 awk 传递您要打印的字段的字符串,然后让它执行此操作。