簡體   English   中英

如何在循環中編寫awk打印命令?

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

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