簡體   English   中英

AWK / bash如何在AWK中包含文件名

[英]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.

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