目錄
- 命令基本格式
- NR與NF
- 批量kill命令
- 一個簡單的替換
awk命令的基本格式
awk '條件類型1{操作1} 條件類型2{操作2} ...' filename
awk常用選項及其含義
-F fs:指定fs作為輸入行的分隔符量承,awk命令默認分隔符為空格或制表符锐借。
-f file:從腳本中讀取awk腳本指令勺卢,以取代直接在命令行輸入指令裙犹。
-v var=val:在執(zhí)行處理過程之前尽狠,設置一個變量var晚唇,并給其設備初始值為val。
一些內置變量
NF:每一行($0)擁有的字段總數
NR:目前awk所處理的是第幾行數據
FS:目前的分隔字符盗似,默認是空格鍵
寫著寫著覺得教程夠多了哩陕,簡單分享使用吧
參考《鳥哥的Linux私房菜(第四版)》,沒書的話看看C語言中文網awk教程:http://c.biancheng.net/view/4082.html
NR與NF
awk '{print $1 "\t lines:" NR "\t columns:" NF}' test1.txt
逐行處理赫舒,打印出每行的第一個字段$1悍及,處理到第幾行NR和每行字段數NF
# test1.txt文件內容
cat test1.txt
line11 line12 line13
line21 line22 line23
line31 line32 line33
#################這是一條分割#
批量kill命令
當當前shell窗口運行的命令全部需要kill的時候(命令較多),可以批量kill
ps -ef | grep commandxxx | grep xxx(用戶) | awk '{print $2}' | while read id; do kill $id; done
# 先查看命令情況
ps -ef | grep java | grep qiuyinbin | awk '{print $2}' | while read id; do wc -l; done
# 使用示例:批量kill用戶qiuyinbin的java命令
ps -ef | grep java | grep qiuyinbin | awk '{print $2}' | while read id; do kill $id; done
# 遇到循環(huán)中的命令缺猛,要等新的命令運行時再kill缨叫,可以加個sleep
ps -ef | grep java | grep qiuyinbin | awk '{print $2}' | while read id; do kill $id;sleep 0.1; done
一個簡單的替換
首先,有兩個文件query_genename.txt和上調基因列表up.txt
文件情況如下荔燎,列之間是tab分隔
$ less -S query_genename.txt
TRINITY_DN9_c5_g1 PPP1R12A
TRINITY_DN9_c4_g1 MAD2L2
TRINITY_DN9_c2_g1 FOPNL
TRINITY_DN9_c1_g1 GGPS1
TRINITY_DN9_c10_g1 CX3CR1
TRINITY_DN9_c0_g1 STRN4
TRINITY_DN99_c4_g1 TDRD12
TRINITY_DN99_c1_g1 WDR37
TRINITY_DN99_c0_g1 ETF1
TRINITY_DN999_c4_g1 FAM92A
TRINITY_DN999_c3_g1 SGCD
TRINITY_DN999_c0_g1 OSBPL9
TRINITY_DN99998_c0_g1 SLC17A4
TRINITY_DN9997_c0_g1 DTYMK
$ less -S up.txt
query C1_Mean C2_Mean FoldChange log2FoldChange FDR
TRINITY_DN2122_c0_g1 131.934049458786 24.5577242060786 5.21580462664745 2.38288983018
TRINITY_DN3132_c0_g1 144.028003992508 25.4672695470445 5.49442801032184 2.45796929925
TRINITY_DN2666_c7_g1 931.234499096598 329.255413429646 2.82325284953719 1.49735834183
TRINITY_DN623_c5_g1 2205.49752678604 677.611279019576 3.25178087581717 1.70123004338
TRINITY_DN5203_c0_g2 447.476317747716 90.9545340965873 4.88085735530767 2.28713458910
TRINITY_DN1236_c0_g1 639.880139875112 230.114971264366 2.77366637828372 1.47179426807
TRINITY_DN623_c3_g1 97.851086681933 15.4622707964198 6.03153331997378 2.5925248067555 2.259
TRINITY_DN6321_c0_g1 182.508768417987 46.3868123892595 3.87790125508826 1.95527606785
目的:使用awk將up文件中的query替換成基因名
awk -F '\t' 'NR==FNR{a[$1]=$2;next}{print a[$1]"\t"$2"\t"$3"\t"$4"\t"$5}' query-genename.txt up.txt > up_genename.txt
解釋:
NR和FNR都表示記錄數(當前處理的行數)耻姥,但是NR從1開始記錄直到所有文件讀取完,FNR則在讀取第二個文件時(這里是up.txt)有咨,從1開始重新計數琐簇。
NR==FNR時,表示讀取處理第一個文件query-genename.txt座享,對這個文件的處理代碼在后面的第一個{}內婉商,即{a[$1]=$2;next},將query-genename.txt第一列$1作為數組a的關鍵字渣叛,第二列$2作為該關鍵字對應的值丈秩。
當NR不等于FNR時(表示已經開始處理第二個文件up.txt),執(zhí)行第二個{}的代碼淳衙,即{print a[$1]"\t"$2"\t"$3"\t"$4"\t"$5}癣籽,第一列根據前面得到的數組替換為基因名挽唉,并打印2-5列,完成轉換筷狼。
$ less -S up_genename.txt
genename C1_mean C2_Mean FoldChange log2FoldChange FDR
GPR68 131.934049458786 24.5577242060786 5.21580462664745 2.38288983018137 1.434
B3GALNT1 144.028003992508 25.4672695470445 5.49442801032184 2.45796929925929
ECHDC3 931.234499096598 329.255413429646 2.82325284953719 1.49735834183681 7.650
SHB 2205.49752678604 677.611279019576 3.25178087581717 1.70123004338373 1.075
SH3TC1 447.476317747716 90.9545340965873 4.88085735530767 2.28713458910152 1.082
CRYBG3 639.880139875112 230.114971264366 2.77366637828372 1.47179426807206 0.000
LPGAT1 97.851086681933 15.4622707964198 6.03153331997378 2.5925248067555 2.259213647271e-07
當有些行未轉換到時,為空值匠童,可以使用awk去除
awk -F'\t' '{if($1!="") print $0}' up_genename.txt > up_genename_fina.txt