[英]AWK/bash how to include a filename in AWK
我有以下awk腳本:
#! /bin/awk -f
BEGIN { FS = ":" }
{ print $1 " " $2 " " $3 " " $4 " " }
我想用“#!/ bin / bash”編寫一個bash腳本,但我需要在其中包含一個文件; 當程序顯示文件。
#! /bin/bash
awk -f, '
FILENAME= $1
BEGIN { FS = ":" }
{ print $1 " " $2 " " $3 " " $4 " " }
'
在上面的代碼中,我試圖包含該文件,但它不起作用?
目前還不清楚你想通過什么。 你想要一個獲取文件名作為值的變量嗎? 最簡單的方法是使用-v var=value
:
#! /bin/bash
awk -v MYFILENAME="$1" '
BEGIN { FS = ":" }
{ print MYFILENAME " " $1 " " $2 " " $3 " " $4 " " }
'
請注意,FILENAME是保留變量,您無法設置它。
或者你想傳遞輸入文件? 在這種情況下,您只需將它們傳遞給程序,如:
#! /bin/bash
awk '
BEGIN { FS = ":" }
{ print MYFILENAME " " $1 " " $2 " " $3 " " $4 " " }
' "$1"
-f
選項包括一個awk
腳本,順便說一句。 所以-f,
會問AWK包含指定文件,
。
在shell級別,請務必始終用"..."
包含變量,如"$1"
以便正確處理帶空格的文件名。
我很難從問題中說出來,但我認為你想要的是
#!/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"
您實際上不需要使用bash來提取文件名。
[ghoti@pc ~]$ cat text
one:two:three:four
cyan:yellow:magenta:black
[ghoti@pc ~]$ cat doit.awk
#!/usr/bin/awk -f
BEGIN { FS=":" }
{
printf("%s %s %s %s\n", $1, $2, $3, $4);
}
[ghoti@pc ~]$ ./doit.awk text
one two three four
cyan yellow magenta black
[ghoti@pc ~]$
但正如蒂姆所說,基於你在問題中所包含的內容,很難弄清楚你要找的結果。 你真的需要在bash中運行你的awk腳本嗎? 您是否需要在awk腳本中提供實際文件NAME?
您提供的問題越詳細,答案中的詳細信息就越准確。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.