簡體   English   中英

在bash腳本中使用awk提取模式

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

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