簡體   English   中英

嘗試在AWK中執行UNIX命令但收到錯誤

[英]Trying to execute unix command in awk but receiving error

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

您實際上並沒有使用任何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

聽起來這就是您要執行的操作:

$ 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)' ,請參見下面的注釋,它比第一種awk方法更健壯,但是它確實假定您的輸入中沒有NUL字符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM