簡體   English   中英

AWK 如何處理多個文件並在控制文件中進行比較! (不是命令行單行)

[英]AWK how to process multiple files and comparing them IN CONTROL FILE! (not command line one-liner)

我閱讀了所有類似問題的答案,但它們對我不起作用,因為我的文件不統一,它們包含多個控制標頭,在這種情況下,創建腳本比單行更安全,所有答案都集中在單行上。 理論上,單行命令應該可以轉換為腳本,但我正在努力實現:

  1. 打印控制頭
  2. 僅打印 <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 {
}

谷歌搜索只給我命令行處理的結果,文檔在這方面也是沉默的。 這是否意味着它無法完成?

也許嘗試:

腳本.awk

BEGIN {
    OFS = FS = "\x01"
    ORS = RS = "\x02\n"
}

NR==FNR {
    if (/^16/) a[$2]
    next
}

/^16/ && !($2 in a) || /^#/

注意括號:a 中!$2 in a中的(!$2) in a

調用:

awk -F script.awk FILE2 FILE1

注意 FILE1 / FILE2 的順序顛倒了; 必須首先讀取 FILE2 以預填充查找表。

首先,對我的問題的簡短回答應該是“不可能”,如果有人仔細閱讀問題並完全了解 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"是單個分隔符而不是兩個分隔符。

暫無
暫無

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

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