Shell
提取列名並使用它來輸出文件名
#chr fivep threep strand sample1 sample2 sample3 sample4 name1 name2 chrI 9442 9492 + 0 0 0 0 na na chrI 12584 12631 + 0 0 0 0 na na chrI 12584 12679 + 16 16 15 22 na na chrI 12584 12727 + 0 0 0 0 na na chrI 12632 12679 + 13 12 16 9 na na
我有一個上述格式的文件。我想要輸出這樣我得到 4 個單獨的文件作為輸出名稱,它們基本上是列 sample1 , sample2 等。
例如,這就是我想要做的:
awk -v OFS="\t" '{print $1,$2,$3,$9":"$10,$5,$4}' > sample1.txt awk -v OFS="\t" '{print $1,$2,$3,$9":"$10,$6,$4}' > sample2.txt awk -v OFS="\t" '{print $1,$2,$3,$9":"$10,$7,$4}' > sample3.txt awk -v OFS="\t" '{print $1,$2,$3,$9":"$10,$8,$4}' > sample4.txt
我可以為幾列執行此操作,但我有一個包含許多列的大文件。如何以循環方式執行此操作,這樣我就不必單獨鍵入每個 awk 語句
使用 for 循環 (
ksh93
,bash
,zsh
):for ((i=5;i<=8;i++)); do awk -v i="$i" -v OFS="\t" 'NR==1{fname=$i".txt"}{print $1,$2,$3,$9":"$10,$i,$4 > fname}' infile done
開始和結束欄位在
for
-loop 中給出。輸出文件名是從帶有附加後綴的標題行中提取的,.txt
並且重定向在awk
.