簡體   English   中英

拆分文本文件並在OSX中使用awk在標頭中添加行數

[英]Splitting text file and adding line count in header with awk in OSX

我想用包含數千行的文本文件執行以下操作

  • 將文件拆分為以B開頭的行(但不包括此行)。
  • 包括每個拆分文件中存在的行數作為標題+附加文本(即<number of lines> " 120"
  • 刪除每行開始的符號(即>

我嘗試了下面的代碼,允許我拆分文件,但文件中存在的行數(如在NR-1 " 120" )是累積的,它打印在拆分文件的最后,而不是在開始時。

awk '/^B/{n++; print NR-1 " 120" > filename;close(filename);next}{filename = "part" n ".txt"; print >filename}'

在我嘗試將其打印為標題時,我使用了以下代碼。 但是假定的標題根本沒有出現。 awk 'BEGIN{print NR-1 " 120" > filename}; /^B/{n++;close(filename);next};{filename = "part" n ".txt"; print >filename}' inputfile.txt

以上代碼附帶以下錯誤: awk: null file name in print or getline source line number 1

我的文本文件看起來像:

>L1212 ATCTATCTTCTATCTGTTAGCTAGCTAGCTA
>L1222 ATCTATCTTCTATCTGTTAGCTAGCTAGCTA
>L1232 ATCTATCTTCTATCTGTTAGCTAGCTAGCTA
B       *        -                     |1|
>L4212 ATCTATCTTCTATCTGTTAGCTAGCTAGCTA
>L4312 ATCTATCTTCTATCTGTTAGCTAGCTAGCTA
>L4412 ATCTATCTTCTATCTGTTAGCTAGCTAGCTA
>L4512 ATCTATCTTCTATCTGTTAGCTAGCTAGCTA
B       *        -                     |2|
>L4212 ATCTATCTTCTATCTGTTAGCTAGCTAGCTA
>L4312 ATCTATCTTCTATCTGTTAGCTAGCTAGCTA
>L4412 ATCTATCTTCTATCTGTTAGCTAGCTAGCTA
>L4512 ATCTATCTTCTATCTGTTAGCTAGCTAGCTA
>L4312 ATCTATCTTCTATCTGTTAGCTAGCTAGCTA
>L4412 ATCTATCTTCTATCTGTTAGCTAGCTAGCTA
>L4512 ATCTATCTTCTATCTGTTAGCTAGCTAGCTA
B       *        -                     |3|

更新:使用@ mklement0腳本而不使用Mawk或GNU awk的環形交叉口,我在textwrangler中使用grep將所有以B開頭的行更改為單個字符~

使用GNU Awk或Mawk:

awk -v RS='\nB       \\*        -                     \\|[0-9]+\\|\n' 'NF {
  numLines = gsub("(^|\n)>", "\n") # replace line-initial ">" and count lines in block
  fname = "part" ++n               # determine next output filename
  printf "%s%s\n", numLines " 120", $0 > fname # output header + block
  close(fname)                               # close output file
}' file

注意:除非輸入文件中的最后一行是分隔線,否則最后一個輸出文件將有一個尾隨空行(但是標題中的數據行計數是正確的) - OP已經確認這不是一個問題。

  • 需要GNU Awk或Mawk,因為只有它們支持基於多字符的基於正則表達式的RS (輸入記錄分隔符)值 - 與macOS附帶的BSD awk不同。 可能以不同的方式解決這個問題,但這會更麻煩一些。

    • GNU Awk和Mawk都可以通過軟件包管理器Homebrew安裝在macOS上; 安裝Homebrew后,只需運行brew install gawkbrew install mawk
  • 該方法通過B分隔線將輸入分成線 因此,每個這樣的塊必須作為整體適合存儲器(可能是由於執行字符串替換而一次兩個副本。

  • 在將它們寫入輸出文件之前將整個行存儲在內存中是允許在前面計算行並將該信息添加到標題中的行

    • numLines = gsub("(^|\\n)>", "\\n")執行line-initial > chars的刪除。 並確定塊中的行數,利用gsub()返回所做替換次數的事實。

暫無
暫無

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

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