使用awk從文件中提取資料時出現問題

使用awk從文件中提取資料時出現問題

我有一個大數據文件,想要根據第1 列中的值將其拆分為較小的文件。有數字「1」或「2」的行' 或 '3' 等在自己的檔案中(最好不排序)。另外,我不想運行該命令 10 次,因此希望它處於循環狀態。

我的文件如下所示:

  • text.txt

    在此輸入影像描述

  • ID.txt

    1
    2
    3
    4
    

我嘗試過的命令:

cat ID.txt | while read line; do awk '$1 == ${line}' test.txt >$line.txt;done

總而言之,我希望它從ID.txt 檔案中讀取值,例如“1”,然後提取第一行中帶有“1”的所有行並將其放入名為1.txt 的檔案中,然後迭代到 2 3 然後 4 等等

但不知何故,我認為 '$1 == ${line}' 部分不起作用

答案1

您正在尋找以下-v選項awk

   -v var=val
   --assign var=val
          Assign the value val to the variable var,  before  execution  of
          the  program  begins.  Such variable values are available to the
          BEGIN rule of an AWK program.

像這樣的事情:

cat ID.txt | 
    while read line; do awk -vline="$line" '$1 == l' test.txt >"$line".txt;done

最好表達為(避免無用地使用 cat):

while read line; do 
    awk -vline="$line" '$1 == l' test.txt >"$line".txt;
done < ID.txt

然而,這是非常緩慢且低效的。您正在為 的每一行運行該awk命令。為什麼不直接讀取並列印匹配的行:test.txtID.txtID.txtawk

awk 'NR==FNR{a[$1]++; next} ($1 in a){print >> $1".txt"}' ID.txt test.txt 

上面保存了ID.txt數組中的第一個欄位aNRFNR是特殊awk變量,意義為“輸入流的當前行”和“當前文件的當前行”。只有當讀取第一個檔案時,兩者才會相等。因此,NR==FNR{a[$1]++; next}只會在第一個文件的行上運行。第二部分將不會被執行,因為它next告訴awk我們要跳到下一行。

第二部分,檢查目前行的第一個欄位(記住,這只在第二個檔案上運行)是否存在於數組中a(這意味著它位於ID.txt),如果存在,則將該行列印到名為在“field1.txt”的檔案中。

相關內容