[英]How do I write an awk print command in a loop?
我想編寫一個循環,分別使用每個輸入文件的第一列創建各種輸出文件。
所以我寫了
for i in $(\ls -d /home/*paired.isoforms.results)
do
awk -F"\t" {print $1}' $i > $i.transcript_ids.txt
done
例如,主目錄中是否有5個文件名為
A_paired.isoforms.results
B_paired.isoforms.results
C_paired.isoforms.results
D_paired.isoforms.results
E_paired.isoforms.results
我想將每個文件的第一列打印到一個單獨的輸出文件中,即我希望有5個輸出文件稱為
A.transcript_ids.txt
B.transcript_ids.txt
C.transcript_ids.txt
D.transcript_ids.txt
E.transcript_ids.txt
或任何其他名稱,只要是5個不同的名稱,我仍然可以將它們鏈接回原始文件。
我知道,awk和loop命令中$的雙重用法都存在問題,但是我不知道如何更改它。
是否可以在循環中編寫這樣的命令?
您可以完全在awk中完成此操作:
awk -F"\t" '{split(FILENAME,a,"_"); out=a[1]".transcript_ids.txt"; print $1 > out}' *_paired.isoforms.results
如果您的輸入文件沒有問題中指出的名稱,則您必須split
其他內容(以及對輸入文件使用其他模式匹配)。
我最初的答案實際上是每次打印某些內容時都進行額外的名稱解析。 這是一個僅在FILENAME
更改時更新輸出文件名的版本:
awk -F"\t" 'FILENAME!=lf{split(FILENAME,a,"_"); out=a[1]".transcript_ids.txt"; lf=FILENAME} {print $1 > out}' *_paired.isoforms.results
這應該做的工作:
for file in /home/*paired.isoforms.results
do
base=${file##*/}
base=${base%%_*}
awk -F"\t" '{print $1}' $file > $base.transcript_ids.txt
done
我假設第一個字段中可以有空格,因為您將分隔符明確設置為tab。 每個文件一次運行awk
。 有多種方法可以對所有文件運行一次awk
,但我不認為這樣做的好處是很大的。 您也可以考慮使用cut
代替awk '{print $1}'
。 請注意,像直接使用ls
一樣,不如直接使用globing令人滿意。 文件名中帶有奇數字符(空格,制表符等)的文件名會出錯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.