[英]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
不同。 有可能以不同的方式解決這個問題,但這會更麻煩一些。
brew install gawk
或brew install mawk
。 該方法通過B
分隔線將輸入分成線塊 。 因此,每個這樣的塊必須作為整體適合存儲器(可能是由於執行字符串替換而一次兩個副本。
在將它們寫入輸出文件之前將整個行存儲在內存中是允許在前面計算行並將該信息添加到標題中的行 。
numLines = gsub("(^|\\n)>", "\\n")
執行line-initial >
chars的刪除。 並確定塊中的行數,利用gsub()
返回所做替換次數的事實。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.