2012-04-22 39 views
0

我有以下awk腳本:AWK/bash中如何將一個文件名在AWK

#! /bin/awk -f 

BEGIN { FS = ":" } 

{ print $1 " " $2 " " $3 " " $4 " " } 

我想代碼以「#/斌/慶典!」 bash腳本,但我需要包括文件與它;當程序顯示文件時。

#! /bin/bash 

awk -f, ' 
FILENAME= $1 
BEGIN { FS = ":" } 

{ print $1 " " $2 " " $3 " " $4 " " } 

' 

在上面的代碼中,我試圖包括該文件,但它不工作?

回答

0

這是我很難從這個問題來講,但我想你想要的是

#!/usr/bin/env bash 

awk -F, ' 
{ 
    #do stuff 
}' "$1" 

將運行在您傳遞到shell腳本文件awk的。但是,如果你想要在awk中替換腳本變量,你可以跳出字面字符串來取代變量。例如:

#!/usr/bin/env bash 

filename="$1" 
awk -F, ' 
{ 
    print "'"$filename"'" 
}' "$1" 

將打印出您傳遞的文件名,與文件中的行數相同。請注意,這將導致awk將所有這些變量視爲文字字符串。所以這也可以工作:

#!/usr/bin/env bash 

filename="$1" 
awk -F, ' 
BEGIN { 
    awksFileName="'"$filename"'" 
} 
{ 
    print awksFileName 
}' "$1" 
+0

那麼我的任務是:1 \t寫一個shell/awk腳本可以與選項的任意組合來運行名爲search_hotels,全部或不帶任何選項: 而要做到這一點,我必須與殼牌合作,把裏面AWK ,我不知道我是否可以用AWK做到這一點。 這就是爲什麼我需要將文件傳遞給AWK。所以我可以爲我的程序提供選項。 – user1253622 2012-04-22 15:39:22

+0

我仍然不確定你究竟是什麼,但看到我編輯。您可以使用上面使用的相同技巧將shell變量分配給awk變量。 – 2012-04-22 15:43:03

+0

但是,最簡單的方法是使用awk的內置FILENAME變量,如果你想知道的話就知道文件名。 – 2012-04-22 15:45:21

2

這是不是很清楚你想通過這裏。你想獲得一個文件名作爲值的變量?最簡單的方法做到這一點是使用-v var=value

#! /bin/bash 

awk -v MYFILENAME="$1" ' 
BEGIN { FS = ":" } 

{ print MYFILENAME " " $1 " " $2 " " $3 " " $4 " " } 
' 

注意,文件名是一個保留的變量,你不能對它進行設置。

還是你想傳遞輸入文件?在這種情況下,你只需通過他們過去的程序,如:

#! /bin/bash 

awk ' 
BEGIN { FS = ":" } 

{ print MYFILENAME " " $1 " " $2 " " $3 " " $4 " " } 
' "$1" 

-f選項是包括awk腳本,順便說一句。因此-f,會要求AWK包含一個名爲,的文件。

在shell級別上,請務必始終使用"..."括起變量,如"$1"中所示,以便您正確處理帶有空格的文件名。

+0

嗯,我的任務是:1. \t編寫一個名爲search_hotels的shell/awk腳本,可以使用任意選項的組合運行,全部或沒有任何選項: 要做到這一點,我必須使用shell並在裏面放置AWK,i不知道我是否可以用AWK做到這一點。 這就是爲什麼我需要將文件傳遞給AWK。所以我可以爲我的程序提供選項。 – user1253622 2012-04-22 15:40:01

+0

爲什麼不把它分成兩個文件,一個是shell部分,另一個是AWK部分?我們稱他們爲'myscript.sh'和'myscript.awk'。然後從你的shell腳本中,你可以調用'awk -f myscript.awk one_or_more_filenames'。 – DarkDust 2012-04-22 15:42:37

+0

啊:D我沒有想過這個:) ..我會嘗試它:)。 – user1253622 2012-04-22 15:44:32

0

你實際上並不需要使用bash來提取文件名。

[[email protected] ~]$ cat text 
one:two:three:four 
cyan:yellow:magenta:black 
[[email protected] ~]$ cat doit.awk 
#!/usr/bin/awk -f 

BEGIN { FS=":" } 

{ 
    printf("%s %s %s %s\n", $1, $2, $3, $4); 
} 

[[email protected] ~]$ ./doit.awk text  
one two three four 
cyan yellow magenta black 
[[email protected] ~]$ 

但是,正如蒂姆所說,根據你的問題包含的內容,很難找出你要找的結果。你真的需要在其他原因下在bash內部運行你的awk腳本嗎?你需要在你的awk腳本中使用實際的文件名嗎?

您提供的問題越詳細,答案中的詳細信息就越準確。

相關問題