我閱讀了類似問題的所有答案,但它們對我不起作用,因為我的檔案不是統一的,它們包含多個控制標題,在這種情況下,創建腳本比單行更安全,并且所有答案都集中在單行上。理論上,單行命令應該可以轉換為腳本,但我正在努力實作:
- 列印控制標題
- 僅列印 <file 1> 中以 16 開頭的記錄,其中 <file 2> 的第 2 列中第 2 列的值不存在
我最終得到了這個:
BEGIN {
FS="\x01";
OFS="\x01";
RS="\x02\n";
ORS="\x02\n";
file1=ARGV[1];
file2=ARGV[2];
count=0;
}
/^#/ {
print;
count ;
}
# reset counters after control headers
NR=1;
FNR=1;
# Below gives syntax error
/^16/ AND NR==FNR {
a[$2];next; 'FNR==1 || !$2 in a' file1 file2
}
END {
}
谷歌搜索只給我命令列處理的結果,檔案在這方面也沒有提及。這是否意味著它不能完成?
uj5u.com熱心網友回復:
也許嘗試:
腳本.awk:
BEGIN {
OFS = FS = "\x01"
ORS = RS = "\x02\n"
}
NR==FNR {
if (/^16/) a[$2]
next
}
/^16/ && !($2 in a) || /^#/
注意括號:!$2 in a將被決議為(!$2) in a
呼叫:
awk -f script.awk FILE2 FILE1
注意 FILE1 / FILE2 的順序是相反的;必須首先讀取 FILE2 以預填充查找表。
uj5u.com熱心網友回復:
首先,對我的問題的簡短回答應該是“不可能”,如果有人仔細閱讀問題并完全了解 AWK,那是顯而易見的答案,我希望我早點知道,而不是浪費幾天時間嘗試撰寫腳本。此外,沒有最小的可重復示例(這對 TeX 組來說總是很痛苦) - 我需要完整的示例作業,如果它在 1 行上作業,則不能保證它是否在 2 行上作業,我的行數是~ 1.27 億。
如果您仔細閱讀代碼,您就會知道什么不起作用 - 我在評論部分中添加了導致語法錯誤的內容。無論如何,正如@Daweo 所建議的那樣,無法在模式部分使用邏輯運算子。所以因為我們不需要在第一個檔案中列印,所以整個技巧是在第二個括號中做條件:
awk -F, 'BEGIN{} NR==FNR{a[$1];next} !($1 in a) { if (/^16/) print $0} ' set1.txt set2.txt
假設在上面的例子中分隔符是逗號。我不知道僅在 gnu awk 中關于多 RS 支持的假設來自哪里。在 MacOS BSD awk 上它的作業原理完全相同,但實際上RS="\x02\n"是單個分隔符而不是兩個分隔符。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/364508.html
上一篇:Terraform為AzureSQL資料庫中的SQL啟用MIcrosoftDefender
下一篇:Mongodb:獲取頂級檔案
