2015-08-30 98 views
2

我有一個輸出一些文件路徑的函數,我需要這些路徑由NUL charachter分隔,而不是新行\n字符。我嘗試下面的代碼:如何在bash中使用AWK添加NUL字符分隔符?

function myfunc 
{ 
    declare -a DUPS 
    # some commands to fill DUPS with appropriate file/folder paths 
    (for i in "${DUPS[@]}"; do echo "$i"; done)|sort|uniq|awk 'BEGIN{ORS="\x00";} {print substr($0, index($0, $2))}' 
} 

但是,如果我管其輸出hexdumphd,沒有NUL字符diplayed。看來,NUL字符不包括在awk輸出:

myfunc | hd 

會打印:

00000000 2f 70 61 74 68 2f 6e 75 6d 62 65 72 2f 6f 6e 65 |/path/number/one| 
00000010 2f 2f 70 61 74 68 2f 6e 75 6d 62 65 72 2f 74 77 |//path/number/tw| 
00000020 6f 2f 2f 70 61 74 68 2f 6e 75 6d 62 65 72 2f 74 |o//path/number/t| 
00000030 68 72 65 65 2f         |hree/| 
00000035 

awk的版本是:

~$ awk -W version 
mawk 1.3.3 Nov 1996, Copyright (C) Michael D. Brennan 

compiled limits: 
max NF    32767 
sprintf buffer  2040 

也可與其他命令,如任何解決方案sed對我來說是可以接受的。
注意:我的問題不是enter link description here的重複,因爲它要求解決方案適用於不同的機器與不同的awk s。但我只需要一個適用於我自己機器的解決方案,因此我可以使用可安裝在Ubuntu 14.04上的任何版本的awk

+0

您使用的是什麼版本的awk? – rici

+0

@rici我怎麼能找到我的'awk'版本? –

+0

安裝gawk,'sudo apt-get install gawk'。或者你可以在我的答案中使用'printf'解決方案來讓'mawk'做你想做的事。 – rici

回答

2

了GNU AWK V4.0.1工作只是你原來的計劃很好,但所有其他awks我已經踢左右(mawkoriginal-awkbusybox awk)產生相同的NUL無關輸出你似乎遇到。看起來用這些awk,使用print或printf打印一個帶有嵌入式NUL的字符串會導致NUL被當作字符串終止符。

但是,如果使用printf "%s",0;,則mawkoriginal-awk將輸出真實的NUL。所以如果你使用其中的一個,你可以將ORS設置爲空字符串,並在你的awk程序結束時添加{printf "%s", 0;}。 (如果您的awk程序使用next,則需要其他更多侵入式修改)。

我不知道任何方式說服busybox awk打印一個NUL字節,所以如果這是你使用你可能要考慮選擇一個真正的awk。

+0

我在代碼中安裝了'Gnu Awk v4.0.1',並用'gawk'代替了'awk'。但結果是一樣的! –

+0

@PHPLearner:你有我。在我的系統上,使用gawk 4.0.1,它可以很好地工作。順便說一句,您可以大大簡化:'printf'%s \ n'「$ {DUPS [@]}」| sort -u | awk ...' – rici

相關問題