簡體   English   中英

awk在bash腳本中讀取字段

[英]Awk reading fields in a bash script

我正在嘗試讀取兩個文本文件,以便檢查兩個文件中的某些字段是否相同。 我可以輕松地在命令行中提取字段,但是從bash腳本執行操作時會出現問題。

我在for循環中生成文件(文件列表)(嘗試過echo和printf命令)

printf "$servidor1$gfs1_dir$gfs1_file\n" >> server1

你可以看到cat命令的輸出

cat server1

ftp://server/pub/data/nccf/com/gfs/prod/gfs.2014011400/gfs.t00z.pgrbf00.grib2
ftp://server/pub/data/nccf/com/gfs/prod/gfs.2014011400/gfs.t00z.pgrbf06.grib2

如果我從命令行嘗試它運行正常。 顯示文件中的兩行/記錄:

awk 'BEGIN { FS="/"} {print $11}' server1

gfs.t00z.pgrbf00.grib2
gfs.t00z.pgrbf06.grib2

但是,如果我想設置FNR,則會出現錯誤(在腳本awk中,它用於構建名為fremote的變量)

awk 'BEGIN { FS="/"} { RS="\n"} {FNR == 1} {print $11}' server1

gfs.t00z.pgrbf00.grib2
gfs.t00z.pgrbf06.grib2

當我在bash腳本中創建fremote var時會出現同樣的情況(我代表腳本中的循環變量)

i=1
fremote=`awk -v i=$i 'BEGIN { FS="/"} { RS="\n"} {FNR == i} {print $11}' servidor1-file.list`

echo $fremote

gfs.t00z.pgrbf00.grib2 gfs.t00z.pgrbf06.grib2

也許它與server1文件的創建方式有關,也許與awk如何訪問它有關。 我找不到正確的觀點。

在此先感謝您的幫助。 我將繼續處理這個問題並發現答案。

編輯

從評論中我添加了調用awk的bash腳本中的代碼(希望它有助於理解我正在嘗試的內容)。 我有兩個文件,本地文件列表和服務器中的遠程文件列表。 我嘗試建立兩個vars flocal和fremote以檢查它們是否相同。 也許有更簡單,更智能的方法來檢查。

while [ $i -le $nlocal ]  
   do
   flocal=`awk -v i=$i 'FNR == i {print $1}' lista.local`
   fremote=`awk -v i=$i 'BEGIN { FS="/"} {FNR == $i} {print $11}' $2`

   if [ "$flocal" != "$fremote" ]; then 
      echo "Some file missing"  >> $log
      flag_check_descarga=0
   else
      contador=$(($contador + 1))
      echo $contador "Download OK" $flocal  >> $log
   fi
   i=$(( $i + 1 ))
done

你的語法錯了。

awk -v i="$i" 'BEGIN { FS="/"; RS="\n"}
    FNR == i {print $11}' server1

BEGIN { ... }塊包含腳本啟動時要執行的操作。 FNR==i { ... }塊包含在讀取文件的第i行時要執行的操作。

無條件塊{ ... }包含無條件執行的操作,即每個輸入行。 FNR==i不是一個有意義的行動; 它只是一個布爾值,當文件的行號等於i時為true。 這是一個很好的條件,但作為一個動作,它沒有做任何事情(你可以從外面發現)。

但是,您似乎試圖解決的任務使用單個Awk腳本更容易解決 - @EtanReisner在評論中發布的那個對我來說很好 - 或者只是

comm -23 <(sort lista.remote) <(sort lista.local)

或者甚至,如果文件已經排序,

comm -23 lista.local lista.remote

總結一下,你最終會得到像這樣的東西

sort -o lista.local lista.local  # make sure lista.local is sorted
awk -F/ '{ print $11 }' server1 |
sort |
comm -23 - lista.local

為了與Unix精神保持一致,如果沒有差異,這將悄然成功,並且失敗(以非零退出代碼退出)並在缺少某些內容時打印缺少的條目。

如果你想打印成功下載的文件,只需要cat lista.local ,或者像sed 's/^/Successfully downloaded /' lista.local

暫無
暫無

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

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