尝试在AWK中执行UNIX命令但收到错误

时间:2018-08-11 08:40:12

标签: bash awk

awk 'BEGIN{FS="|"; } {print $2|"od -An -vtu1"| tr -d "\n"}' test1.txt

我有文件

1|siva
2|krishna
3|  syz 5

我正在尝试查找字段2的ascii值,但是在命令以下给我错误

awk 'BEGIN{FS="|"; } {print $2|"od -An -vtu1"| tr -d "\n"}' test1.txt


awk: BEGIN{FS="|"; } {print $2|"od -An -vtu1 tr -d "\n"}
awk:                                                ^ backslash not last character on line

预期产量

115 105 118  97
107 114 105 115 104 110  97
32 115 121 122  32  53

2 个答案:

答案 0 :(得分:0)

您实际上并没有使用任何awk,也许这更容易...

$ while IFS='|' read -r _ f; 
  do echo -n "$f" | od -An -vtu1; 
  done < file

 115 105 118  97
 107 114 105 115 104 110  97
  32  32 115 121 122  32  53

答案 1 :(得分:-1)

听起来这就是您要执行的操作:

$ awk '
BEGIN { FS="|" }
{
    cmd = "printf \047%s\047 \047" $2 "\047 | od -An -vtu1"
    system(cmd)
}
' file
 115 105 118  97
 107 114 105 115 104 110  97
  32  32 115 121 122  32  53

或其他语法,因此输出来自awk,而不是system()调用的shell:

$ awk '
BEGIN { FS=OFS="|" }
{
    cmd = "printf \047%s\047 \047" $2 "\047 | od -An -vtu1"
    rslt = ( (cmd | getline line) > 0 ? line : "N/A" )
    close(cmd)
    print $0, rslt
}
' file
1|siva| 115 105 118  97
2|krishna| 107 114 105 115 104 110  97
3|  syz 5|  32  32 115 121 122  32  53

适合的按摩。您不需要将结果保存到变量中,可以只打印它,但我想您会在某个时候想知道该怎么做,当然也不需要打印$ 0。

我还假设您出于某种原因想要在awk中执行此操作,例如它是较大脚本的一部分,否则,与使用Shell执行Shell命令相比,使用awk调用system调用shell来执行Shell命令只是一个坏主意。

话虽如此,我能想到的最好的shell命令是使用GNU awk来实现多字符RS:

$ awk -F'|' -v ORS='\0' '{print $2}' file |
    od -An -vtu1 |
    awk -v RS='  0\\s' '{gsub(/\n/,"")}1'
115 105 118  97
107 114 105 115 104 110  97
 32  32 115 121 122  32  53

如果输入包含'$(command)',但它确实假定您的输入中没有NUL字符,请参见以下注释,它比第一种awk方法更健壮。