我有一個大數據文件,想要根據第1 列中的值將其拆分為較小的文件。有數字「1」或「2」的行' 或 '3' 等在自己的檔案中(最好不排序)。另外,我不想運行該命令 10 次,因此希望它處於循環狀態。
我的文件如下所示:
我嘗試過的命令:
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.txt
ID.txt
ID.txt
awk
awk 'NR==FNR{a[$1]++; next} ($1 in a){print >> $1".txt"}' ID.txt test.txt
上面保存了ID.txt
數組中的第一個欄位a
。NR
和FNR
是特殊awk
變量,意義為“輸入流的當前行”和“當前文件的當前行”。只有當讀取第一個檔案時,兩者才會相等。因此,NR==FNR{a[$1]++; next}
只會在第一個文件的行上運行。第二部分將不會被執行,因為它next
告訴awk
我們要跳到下一行。
第二部分,檢查目前行的第一個欄位(記住,這只在第二個檔案上運行)是否存在於數組中a
(這意味著它位於ID.txt
),如果存在,則將該行列印到名為在“field1.txt”的檔案中。