簡體   English   中英

在行列表中的行號之間打印行,並使用GNU Parallel將每個實例保存在單獨的文件中

[英]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.

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