[英]Print lines between line numbers from a line list and save every instance in separate file using GNU Parallel
我有一個文件,說“ Line_File”,其中包含行開始和結束號以及文件ID的列表:
F_a 1 108
F_b 109 1210
F_c 131 1190
我有另一個文件“ Data_File”,我需要從中獲取從Line_File提取的行號之間的所有行。
sed中的命令:
'sed -n '1,108p' Data_File > F_a.txt
做這項工作,但我需要對Line_File的第2列和第3列中的所有值執行此操作,並將其保存為Line_File的第1列中提到的文件名。
如果$ 1,$ 2和$ 3是Line_File的三個列,則我在尋找類似的命令
'sed -n '$2,$3p' Data_File > $1.txt
我可以使用Bash Loop來運行相同的文件,但是對於很大的文件(例如40GB)來說,這將非常慢。
我特別想這樣做,因為我試圖使用GNU Parallel使其更快,並且基於行號的切片將使輸出不重疊。 我正在嘗試執行這樣的命令
cat Data_File | parallel -j24 --pipe --block 1000M --cat LC_ALL=C sed -n '$2,$3p' > $1.txt
但是我實際上不能正確使用列分配$ 1,$ 2和$ 3。
我嘗試了以下命令:
awk '{system("sed -n \""$2","$3"p\" Data_File > $1"NR)}' Line_File
但這是行不通的。 知道我要去哪里錯了嗎?
PS:如果我的問題不清楚,請指出我還應該分享什么。
您可以將xargs
與-P
(並行)選項一起使用:
xargs -P 8 -L 1 bash -c 'sed -n "$2,$3p" Data_File > $1.txt' _ < Line_File
說明:
xargs
命令通過使用<
將Line_File
作為輸入 -P 8
選項允許它並行運行多達8個進程 -L 1
使xargs
處理一行 bash -c ...
為輸入文件中的每一行分叉bash
_
在<
之前將_
傳遞為$0
,並在每個輸入行中將其余3列傳遞為$1, $2,
$ 3`。 sed -n
通過形成命令行來為每一行運行sed
命令 或者您可以像這樣使用gnu parallel
:
parallel --colsep '[[:blank:]]' "sed -n '{2},{3}p' Data_File > {1}.txt" :::: Line_File
awk
解救!
這只會掃描數據文件一次
$ awk 'NR==FNR {k=$1; s[k]=$2; e[k]=$3; next}
{for(k in s) if(FNR>=s[k] && FNR<=e[k]) print > (k".txt")}' lines data
這可能對您有用(GNU並行和sed):
parallel --dry-run -a lineFile -C' ' "sed -n '{2},{3}p' dataFile > {1}'
這使用列分隔符-C ' '
並將其設置為空格,然后將lineFile的前3個字段設置為{1}
, {2}
和{3}
。 --dry-run
選項允許您在實際運行之前檢查並行生成的命令。 一旦命令看起來正確,請刪除--dry-run
選項。
您可能不受CPU限制。 您的磁盤很有可能成為限制因素。 為避免一遍又一遍地讀取DataFile,應並行運行盡可能多的作業。 這樣,緩存將幫助您:
cat Line_file |
parallel -j0 --colsep ' ' sed -n {2},{3}p Data_File \> {1}.txt
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.