主要學(xué)習(xí)自Linux操作與生物信息_嗶哩嗶哩_bilibili
生信入門(mén) linux實(shí)用基礎(chǔ)1 2 3
生信入門(mén) R實(shí)用基礎(chǔ)1 2
1 文件搜索 find
參考
linux 根據(jù)文件大小查找文件 - 朝陽(yáng)的向日葵 - 博客園 (cnblogs.com)
linux通配符和正則表達(dá)式_瘋狂的程序員11的博客-CSDN博客_mv 正則表達(dá)式
find ./ -name '*.fna' 搜索當(dāng)前目錄下以.fna結(jié)尾的文件
find ./ -amin 5 搜索當(dāng)前目錄下最近5分鐘生成的文件
find ./ -size +1k 搜索當(dāng)前目錄下大于1k的文件
find ./ -name '*.fna' -exec rm '{}' \; 搜索當(dāng)前目錄下以.fna結(jié)尾的文件并執(zhí)行刪除
find ./ -size +10M -mtime -2 查找當(dāng)前路徑下,文件大小大于100M,并且2天內(nèi)更 新過(guò)的文件,顯示出來(lái)
find ./ -size +10M -size -20M 查找當(dāng)前路徑下,文件大小大于10M小于20M的文件
find ./ -type f -mtime -1 -size +100k -size-400k -type f表示只查找文件,過(guò)濾掉文件夾,塊文件
- 通配符與正則表達(dá)式:
通配符用于匹配文件名,由shell解析的,比如find,ls,cp,mv等命令支持通配符查找文件名。
正則表達(dá)式元字符有字符匹配、匹配次數(shù)、位置錨定、分組。主要是處理文本里的內(nèi)容,用來(lái)匹配文本里的字符串,針對(duì)文件內(nèi)容的文本過(guò)濾工具里,大都用到正則表達(dá)式,如grep,sed,awk,vim, less,nginx,varnish等命令支持正則表達(dá)式。
更多正則表達(dá)式學(xué)習(xí)可看這個(gè):你是如何學(xué)會(huì)正則表達(dá)式的? - 知乎 (zhihu.com)
2 文本篩選 grep
參考grep命令詳解;單引號(hào)和雙引號(hào)區(qū)別 - 刷子丶 - 博客園 (cnblogs.com)

單、雙引號(hào)區(qū)別
- 單引號(hào):可以說(shuō)是所見(jiàn)即所得:即將單引號(hào)內(nèi)的內(nèi)容原樣輸出,或者描述為單引號(hào)里面看到的是什么就會(huì)輸出什么。單引號(hào)''是全引用,被單引號(hào)括起的內(nèi)容不管是常量還是變量者不會(huì)發(fā)生替換。
- 雙引號(hào):把雙引號(hào)內(nèi)的內(nèi)容輸出出來(lái);如果內(nèi)容中有命令、變量等,會(huì)先把變量、命令解析出結(jié)果,然后在輸出最終內(nèi)容來(lái)。雙引號(hào)""是部分引用,被雙引號(hào)括起的內(nèi)容常量還是常量,變量則會(huì)發(fā)生替換,替換成變量?jī)?nèi)容。
- 不加引號(hào):不會(huì)將含有空格的字符串視為一個(gè)整體輸出, 如果內(nèi)容中有命令、變量等,會(huì)先把變量、命令解析出結(jié)果,然后在輸出最終內(nèi)容來(lái),如果字符串中帶有空格等特殊字符,則不能完整的輸出,需要改加雙引號(hào),一般連續(xù)的字符串,數(shù)字,路徑等可以用。
- 使用規(guī)則:一般常量用單引號(hào)''括起即可,如果含有變量則用雙引號(hào)""括起,無(wú)變量無(wú)空格無(wú)特殊字符的連續(xù)字符串可不加引號(hào)
- 最大不同:?jiǎn)我?hào)與雙引號(hào)的最大不同在于雙引號(hào)仍然可以保有變數(shù)的內(nèi)容,但單引號(hào)內(nèi)僅能是一般字符,而不會(huì)有特殊符號(hào),
常用命令示例
grep ">" a.txt | wc -l 搜索文件中含有'>'的行,并統(tǒng)計(jì)行數(shù)
grep -c ">" a.txt 統(tǒng)計(jì)有'>'的行數(shù), 等價(jià)于同上
grep -w "chr1" a.txt 搜索全詞精確匹配'chr1'的行,-w表示整個(gè)word都匹配上
grep -n "chr1" a.txt 搜索含有字符'chr1'的行并列出行號(hào)
grep -vc "chr" a.txt 統(tǒng)計(jì)不含'chr'的行數(shù)的個(gè)數(shù)
grep 'chr' a.txt | grep -v 'chrX' 搜索文本中含有Chromosome的行并排除有Annotation 行
grep -e "chrX" -e "chrY" a.txt 參數(shù)-e進(jìn)行多項(xiàng)操作(指定多個(gè)匹配模式,只要符合一個(gè)都會(huì)被輸出)
grep -w "chr1" a.txt -A 2 搜索全詞精確匹配'chr1'的行行并列出下面兩行。 -A表示after
grep -w "chr1" a.txt -B 2 使用grep的-B選項(xiàng),顯示匹配內(nèi)容及其前n行。-B表示before。
grep -w "chr1" a.txt -C 2 使用grep的-C選項(xiàng),顯示匹配內(nèi)容及其前n行和后n行。
ls /usr/bin/ | grep "\.py" 搜索特定目錄下名字包含'.py'的文件('.'需要轉(zhuǎn)義'./')
ls /usr/bin/ | grep "\.py\b" 或 "\.py$" 搜索特定目錄中以'.py'結(jié)尾的文件( '\b'或'$'表示結(jié)尾)
ls /usr/bin/ | grep "^ht" 搜索特定目錄中以'ht'開(kāi)頭的文件
grep 1[1-9] a.txt 應(yīng)用正則表達(dá)式搜索包含'11'-'19'的行
grep -vP "^\s*$" 1.txt 去除空白行
grep -P "^\d{11}$" 1.txt 匹配含11位數(shù)字的行
grep應(yīng)用正則表達(dá)式的常用示例
.替換某個(gè)字符(換行符除外),如grep "e.t" 1.txt
\轉(zhuǎn)義,如.不能替代自身,需用\.來(lái)轉(zhuǎn)義
*通配符可匹配前面的子表達(dá)式0或多次,如go*可匹配g和gooo,經(jīng)常和.一起使用.*可匹配任意字符無(wú)限多次-
?和+,{},|,[]等使用需要用grep -E,即擴(kuò)展的正則表達(dá)式
+表示匹配1次及以上
?表示匹配0或1次
{1,10}表示重復(fù)1到10次
|表示或者,擇意匹配,如grep -E "eat|cat" 1.txt,匹配eat或cat
[]匹配括號(hào)內(nèi)任意字符,如grep -E "[ec]at" 1.txt
-
grep不支持以下字符集簡(jiǎn)寫(xiě),需要用
grep -P
^\s*$表示行首與尾都是空白(即空白行)
去除空白行 :grep -vP "^\s*$" 1.txt
匹配11位電話(huà)號(hào)碼:grep -P "^\d{11}$" 1.txt
3 sed (stream editor,流編輯器) (以每行為單位編輯)
注意sed結(jié)果默認(rèn)為屏幕輸出,并不改變?cè)瓉?lái)文件內(nèi)容,常用>重定向保存修改文件
sed
-e 默認(rèn)模式,一般用于多項(xiàng)修改,之后常用>重定向保存修改文件
-i 在原文件上直接進(jìn)行修改
-n 安靜模式,僅顯示處理后的結(jié)果,常與p連用,只輸出發(fā)生更改的特定行
-f 接腳本文件
- 各種替換操作:
sed 's/NC/nc/g' 1.txt >2.txt 對(duì)文件中的NC替換成nc并另存為,s表示替換,g表示全局,命令一般用 ' '括起來(lái)
sed 's/A/a/2' 1.txt 對(duì)文件中的每行第2個(gè)A替換成a
sed 's/b/B/g;s/a/A/g' 1.txt 替換b和a為大寫(xiě),同時(shí)進(jìn)行多項(xiàng)操作可用`;`分隔開(kāi)
sed '1,5s/:/?/g' 2.txt 只對(duì)文件的1至5行內(nèi)容進(jìn)行替換':'為'?'
sed '1,5!s/:/?/g' 2.txt 只對(duì)文件的1至5行內(nèi)容不進(jìn)行替換,!表示非
sed '/>/!s/A/a/g' gene.fasta 對(duì)含有>的行不進(jìn)行操作,其他行進(jìn)行替換
sed '/beat/,/ggle/s/o/O/g' 1.txt 將含有'beat' 和'ggle'字符行的中間行的'o'替換成'O',選擇條件之間用`/`和`,`隔開(kāi)
# sed常用的應(yīng)用: 將fastq格式轉(zhuǎn)化為fasta格式
zcat A.1.fq.gz |sed '0~4d' |sed '0~3d' |sed 's/^@/>/1' |less
若想要同一時(shí)間逐個(gè)替換多項(xiàng)內(nèi)容則需要用y選項(xiàng),如ATCG分別替換為TAGC,(注意默認(rèn)為全局替換,末尾不加g)
sed '/>/!y/ATCG/TAGC/' gene.fasta (含有>的行不進(jìn)行替換)
各種刪除與輸出操作:
sed '/^\s*$/d' 1.txt 刪除文件中空白行,^\s*$表示行首與尾都是空白(即空白行),d表示刪除
sed '3,10d' 1.txt 刪除文件第3至10行
sed '3,$d' 1.txt 刪除文件中第3行及之后所有行的內(nèi)容
sed -n '3,10p' 1.txt 輸出文件第3至10行
sed -n '3p;10p' 1.txt 輸出文件第3行和10行,也可寫(xiě)成 sed -ne '3p' -e '10p' 1.txt
sed -n 's/NC/nc/p' 1.txt 只輸出發(fā)生'NC'/'nc'替換的行
sed -n '/Chromosome:/p' gene.txt 輸出含有Chromosome:的行
sed 's/:.*//g' 2.txt 刪除文件中每行的:及之后的所有內(nèi)容,即把:后的所有內(nèi)容(用.*表示)替換為空
若想在sed使用多項(xiàng)命令,還可以在輸入第一個(gè) ' 后回車(chē),即可在>后輸入多命令
tr命令
tr命令可看做簡(jiǎn)化版本的sed ,類(lèi)似于sed的y選項(xiàng)命令,常用于替換大小寫(xiě)等
tr [A-Z] [a-z] <a.txt 全局替換大小寫(xiě)
tr [ATCG] [TAGC] <a.txt 將ATCG分別替換為T(mén)AGC
tr -d [chr] <a.txt 刪除文件中的chr字符 d表示刪除
4 驚人的awk:強(qiáng)大的文本分析工具(以每列為單位編輯)
(一般常用gawk版本)
-fprogfile 接腳本
-Ffile-separator 分隔符
-vvar=var 變量
常用命令示例
awk '{print $1,$3}' 1.txt 輸出文件第1和3列 ,命令用在'{ }'里寫(xiě),$0表示輸出整行
awk '{print $NF}' 1.txt 輸出文件最后一列(NF表示最后字段)
awk '$1>$2' 1.txt 輸出第1列數(shù)值大于第二列數(shù)值的行
awk '$4>300 && $4<800' 1.txt 輸出第4列數(shù)值大于300小于800的行
awk -F "\"" '{print$4}' 1.txt #以"為分隔符(\"轉(zhuǎn)義),輸出第4列
awk -F '"' '{print $2,"name:\n"$4}' 1.txt 可以在print輸出中添加字符內(nèi)容 name:\n(換行符)
awk '{if ($1>=500 && $2>=1000) print $0}' x.txt 對(duì)文本設(shè)置條件篩選進(jìn)行輸出
awk '{if ($1>200 && $2>500) print $0}' x.txt |sort -n -k1 |uniq |wc 統(tǒng)計(jì)符合篩選條件的數(shù)據(jù)
awk '{if ($1>1000) print "SoBig!!!:"$1 ;else print "Normal"}' x.txt 利用if else 語(yǔ)句進(jìn)行條件篩選輸出
awk '$0~/chrmt/{print $0}' 1.txt 輸出文件中包含有'chrmt'的行
awk -F ':' '$2~/10/{print $0}' 1.txt 以:為分隔符,輸出第2列數(shù)值為10的行(若排除2列則為'$2!~')
- 生成.txt文件列表,便于之后寫(xiě)程序批量化處理數(shù)據(jù)(注意當(dāng)用\易混淆時(shí)可用#作為分隔符):
find ./ -name '*.txt' |sed 's#\.#/media/sf_s#1' |awk -F '/' '{print $NF"="$0}' |sed 's/.txt//1'

BEGIN與END

操作前后添加語(yǔ)句:
awk 'BEGIN{print "\nThe Work Begin!!!\n" } {if($1>200 && $2>500) print $0} END{print "\n THE WORK END!!!!!\n"}' x.txt
5 參數(shù)傳遞xargs
參考xargs命令詳解,xargs與管道的區(qū)別 - 薰衣草的旋律 - 博客園 (cnblogs.com)
xargs與管道的區(qū)別:
xargs傳遞的是命令行參數(shù):xargs命令可以通過(guò)管道接受字符串,并將接收到的字符串通過(guò)空格分割成許多參數(shù)(默認(rèn)情況下是通過(guò)空格分割) 然后將參數(shù)傳遞給其后面的命令,作為后面命令的命令行參數(shù);管道符傳遞的是標(biāo)準(zhǔn)輸入,字符串
如:
echo '--help' | cat該命令輸出的是echo的內(nèi)容:'--help'
echo '--help' | xargs cat等價(jià)于 cat --help ,輸出cat 幫助文檔信息
find ./ -name '*.txt' | rm此操作無(wú)效
find ./ -name '*.txt' |xargs rm搜索文件名后進(jìn)行刪除
find ./ -name '*.txt' |xargs tar -zcvf 10.tar.gz搜索特定文件名后進(jìn)行打包壓縮xargs常用應(yīng)用:利用xargs終止特定進(jìn)程:
sleep 500 &將進(jìn)程sleep放入后臺(tái)運(yùn)行
ps -u 'gu' | awk '/sleep/{print $1}' | xargs kill列出用戶(hù)gu下的進(jìn)程,搜索sleep進(jìn)程并列出第一列的pid號(hào),kill程序參數(shù):
最常用參數(shù):
-d 分隔符,默認(rèn)為換行符/n
-i (不是所有l(wèi)inux都支持) 或者是-I,將xargs的每項(xiàng)名稱(chēng),一般是一行一行賦值給 {},可以用 {} 代替。
-n num 后面加次數(shù),表示命令在執(zhí)行的時(shí)候一次用的argument的個(gè)數(shù),默認(rèn)是用所有的(注意-I -L -n是排斥的)
其他:
-a 接文件,從文件中讀
-e flag,注意有時(shí)候可能會(huì)是-E,flag必須是一個(gè)以空格分隔的標(biāo)志,當(dāng)xargs分析到含有flag這個(gè)標(biāo)志的時(shí)候就停止
-L -l 同 -L, num 從標(biāo)準(zhǔn)輸入一次讀取 num 行送給 command 命令。
-p 當(dāng)每次執(zhí)行一個(gè)argument的時(shí)候詢(xún)問(wèn)一次用戶(hù)。
-P 修改最大的進(jìn)程數(shù),默認(rèn)是1,為0時(shí)候?yàn)閍s many as it can ,應(yīng)該平時(shí)都用不到的吧
-r no-run-if-empty 當(dāng)xargs的輸入為空的時(shí)候則停止xargs,不用再去執(zhí)行了。
-s num 命令行的最大字符數(shù),指的是 xargs 后面那個(gè)命令的最大命令行字符數(shù)
-t 表示先打印命令,然后再執(zhí)行
-x exit的意思,主要是配合-s使用
- 使用示例
cat test.txt | xargs xargs 默認(rèn)是echo的功能,打印內(nèi)容并去除換行符
cat test.txt | xargs -n3 每行打印3個(gè)單詞為一行( 字符排成3列)
cat test.txt | xargs -d: -n3 以:為分隔符, 每行輸出3 列內(nèi)容
搜索指定目錄下的txt文件,將其復(fù)制到當(dāng)前目錄,并將其打包:
find ~/wk/ -name '*txt' | xargs -i cp {} ./ | tar -zcvf hhh.tar.gz *.txt
生信入門(mén) linux實(shí)用基礎(chǔ)1 2 3
生信入門(mén) R實(shí)用基礎(chǔ)1 2



