[英]Extracting patterns with awk within a bash script
我有這個制表符分隔的文件。
Test.txt
chr1 10111412 apples
chr2 195121230 pears
chr2 991924122 elephants
如果我想要來自chr2的第1欄中的內容,
awk '/chr2\\t/ Test.txt
輸出:
chr2 195121230 pears
chr2 991924122 elephants
但是,如果我從chr1到chr25有幾億行,並且需要將它們拆分為特定於chr的文本文件,我想這樣做:
#!/bin/sh
for num in $(seq 1 25)
do
awk '/chr$num\t/' Test.txt > chr$num.txt
done
我也嘗試將awk更改為sed
sed -n 'chr$num\\t/p' Test.txt
當然,兩者都失敗了。 我懷疑腳本會將'/chr$num\\t/'
識別為單個變量。 如何打破這種識別模式並使腳本正常工作?
您可以修改以下代碼:
awk '$1 ~ /^chr[0-9]+$/ { x = $1; gsub(/chr/, "file.", x); print > x }'
給定輸入流:
chr1 d e
chr1 f g
chr44 abc def
chr3 cba fed
它生成3個文件, file.1
, file.3
和file.44
。 您可以通過混淆gsub()
函數調用來控制生成的文件名。
請注意,這僅使數據文件一次通過,這比使25次通過大文件更為明智。
已在GNU和Mac OS X(BSD)版本的awk
。
使用awk
可以更簡單地完成它:
awk '{print >> $1".txt"}' input.file
而已。
如果文件很大,並且第一列的不同值很多,則文件描述符可能用完了。 在這種情況下,您需要在寫入文件后關閉文件:
awk '{f=$1".txt"; print >> f; close(f)}' input.file
您需要一個"
而不是一個'
。
單引號不會插入任何內容,但是雙引號會進行插值(例如變量,反引號,某些\\換碼等)。
嘗試以下腳本。
#!/bin/sh
for num in $(seq 1 25)
do
awk "/chr$num\t/" Test.txt > chr$num.txt
done
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.