awk 使用记录——自留(不定时更新)

提取指定列数

提取第一列和最后一列

awk '{print $1, $NF}' example.txt

提取第一列和倒数第二列

awk '{print $1, $(NF-1)}' example.txt

提取第一列和中间一列

awk '{print $1, $(NF/2)}' example.txt

提取奇数列

awk '{for(i=1; i<=NF; i+=2) printf "%s ", $i; printf "\n"}' example.txt

提取偶数列

awk '{for(i=2; i<=NF; i+=2) printf "%s ", $i; printf "\n"}' example.txt

提取包含指定字符的列

$cat example.txt
aaa 111 X 222 333 bbb
ccc 444 X 555 666 ddd
eee 777 X 888 999 fff
$awk -v c=X '{for(i=1; i<=NF; i++) if(index($i,c)) printf "%s ", $i; printf "\n"}' example.txt
X
X
X
#-v用于创建一个变量,本例中为c,它等于指定的字符,这里为X,函数index(s,t)用于查找字符串s中出现字符串t的位置,如果找不到则返回0

提取同时包含多个指定字符的列

$cat example.txt
abcXdef 111 XxyzX 222 333 bbb
cXcc 444 XXy 555 666 ddd
eeeX 777 XXXy 888 999 fff
$awk -v c="X" '{for(i=1; i<=NF; i++) {if(index($i,c) && index($i,"y")) printf "%s ", $i;} printf "\n"}' example.txt
XxyzX
XXy
XXXy
#NF表示当前行的字段数(列数),使用循环遍历每个列号,使用if语句检查当前列是否同时包含指定字符和其他指定字符,如果满足条件则使用 printf 语句打印该列的值

提取只要包含多个指定字符中的一个的列

$cat example.txt
abcXdef 111 XxyzX 222 333 bbb
cXcc 444 XXy 555 666 ddd
eeeX 777 XXXy 888 999 fff
$awk -v chars="X y" '{for(i=1; i<=NF; i++) {split(chars, arr, " "); for(j in arr) {if (index($i, arr[j])) { printf "%s ", $i; break;} } } printf "\n" }' example.txt
abcXdef XxyzX
cXcc XXy
eeeX XXXy
#NF表示当前行的字段数(列数)。循环遍历每个列号,并使用split函数将chars变量根据空格拆分成一个字符数组arr。然后循环遍历数组arr中的每个元素,使用if语句检查当前列是否包含arr中的任意一个字符。如果满足条件,则使用printf语句打印该列的值,并使用break跳出内层循环。最后使用printf语句换行

去除第二列最后两个字符

$head file
Gh_D09G0162     Gorai.006G020900.1
Gh_D09G0163     Gorai.006G018200.1
Gh_D09G0165     Gorai.006G020000.1
Gh_D09G0166     Gorai.006G020000.1
Gh_D09G0166     Gorai.006G019800.1
Gh_D09G0166     Gorai.006G020100.1
Gh_D09G0167     Gorai.006G020400.1
Gh_D09G0167     Gorai.006G020100.1
Gh_D09G0167     Gorai.006G019800.1
Gh_D05G3649     Gorai.005G139300.1
$awk '{print $1, substr($2, 1, length($2)-2)}' file | head
Gh_D09G0162 Gorai.006G020900
Gh_D09G0163 Gorai.006G018200
Gh_D09G0165 Gorai.006G020000
Gh_D09G0166 Gorai.006G020000
Gh_D09G0166 Gorai.006G019800
Gh_D09G0166 Gorai.006G020100
Gh_D09G0167 Gorai.006G020400
Gh_D09G0167 Gorai.006G020100
Gh_D09G0167 Gorai.006G019800
Gh_D05G3649 Gorai.005G139300
#substr($2, 1, length($2)-2) 表示对第二个字段进行子字符串操作,从位置1开始到长度减去2的位置,即去掉最后两个字符

不展示(忽略)文本的前5行

$cat file | head
genome.standard.fa zb1s3.genome.fsa
NUCMER

    [P1]  [SUB]  [P2]      |   [BUFF]   [DIST]  |  [LEN R]  [LEN Q]  | [FRM]  [TAGS]
========================================================================================
     680   . T   115038    |      680      680  | 118841821 128952358  |  1  1  Chr01   Chr01
    2127   . G   116486    |      573     2127  | 118841821 128952358  |  1  1  Chr01   Chr01
    2700   . T   117060    |       48     2700  | 118841821 128952358  |  1  1  Chr01   Chr01
    2748   . T   117109    |       48     2748  | 118841821 128952358  |  1  1  Chr01   Chr01
    2895   . T   117257    |      147     2895  | 118841821 128952358  |  1  1  Chr01   Chr01
$awk 'NR>5 {print}' file | head
     680   . T   115038    |      680      680  | 118841821 128952358  |  1  1  Chr01   Chr01
    2127   . G   116486    |      573     2127  | 118841821 128952358  |  1  1  Chr01   Chr01
    2700   . T   117060    |       48     2700  | 118841821 128952358  |  1  1  Chr01   Chr01
    2748   . T   117109    |       48     2748  | 118841821 128952358  |  1  1  Chr01   Chr01
    2895   . T   117257    |      147     2895  | 118841821 128952358  |  1  1  Chr01   Chr01
    5015   . A   119378    |       52     5015  | 118841821 128952358  |  1  1  Chr01   Chr01
    5067   . T   119431    |       52     5067  | 118841821 128952358  |  1  1  Chr01   Chr01
    5124   . T   119489    |       57     5124  | 118841821 128952358  |  1  1  Chr01   Chr01
    5411   . G   119777    |       71     5411  | 118841821 128952358  |  1  1  Chr01   Chr01
    5482   . C   119849    |       71     5482  | 118841821 128952358  |  1  1  Chr01   Chr01
#NR>5:这是一个模式,它表示匹配行号(NR)大于5的行。换句话说,这个模式只会对文件中的第6行及以后的行进行匹配。
#{print}:这是一个动作,当模式匹配时,它会打印对应的行内容。这里的print表示打印整个行,相当于print $0,其中$0表示当前行的全部内容。

末尾添加一列随机命名且不重复

$cat file | head
T . 115038 128952358 Chr01
G . 116486 128952358 Chr01
T . 117060 128952358 Chr01
T . 117109 128952358 Chr01
T . 117257 128952358 Chr01
A . 119378 128952358 Chr01
T . 119431 128952358 Chr01
T . 119489 128952358 Chr01
G . 119777 128952358 Chr01
C . 119849 128952358 Chr01
$awk '{print $0, "RAND" NR}' file | head
T . 115038 128952358 Chr01 RAND1
G . 116486 128952358 Chr01 RAND2
T . 117060 128952358 Chr01 RAND3
T . 117109 128952358 Chr01 RAND4
T . 117257 128952358 Chr01 RAND5
A . 119378 128952358 Chr01 RAND6
T . 119431 128952358 Chr01 RAND7
T . 119489 128952358 Chr01 RAND8
G . 119777 128952358 Chr01 RAND9
C . 119849 128952358 Chr01 RAND10
#{print $0, "RAND" NR}:这是一个动作,表示对于每一行,打印该行的内容($0表示当前行的全部内容),然后在末尾添加一个空格以及"RAND"和当前行号(NR)的组合。"RAND"表示固定的字符串,NR表示awk内置的变量,表示当前处理的行号。

计算指定列的平均数,筛选平均数≥1

$head merge.TPM
GS01G_00010 0.0 0.0 0.0
GS01G_00020 12.575217 9.527856 6.560957
GS01G_00030 0.0 0.0 0.0
GS01G_00040 0.0 0.0 0.0
GS01G_00050 0.0 0.039282 0.035251
GS01G_00060 6.973373 6.714577 8.624231
GS01G_00070 24.441532 20.694584 15.559963
GS01G_00080 3.523104 3.469265 3.189162
GS01G_00090 0.319885 0.462513 0.000000
GS01G_00100 10.710373 11.983691 12.148942
$awk '{ sum = ($2 + $3 + $4) / 3; print $1, $2, $3, $4, sum }' merge.TPM | awk '$5 >= 1' |head
GS01G_00020 12.575217 9.527856 6.560957 9.55468
GS01G_00060 6.973373 6.714577 8.624231 7.43739
GS01G_00070 24.441532 20.694584 15.559963 20.232
GS01G_00080 3.523104 3.469265 3.189162 3.39384
GS01G_00100 10.710373 11.983691 12.148942 11.6143
GS01G_00110 2.014478 2.705201 2.098287 2.27266
GS01G_00120 8.610779 8.694838 10.059820 9.12181
GS01G_00130 28.963228 30.421942 32.035297 30.4735
GS01G_00150 26.803879 24.661039 25.260504 25.5751
GS01G_00160 24.505308 21.781004 27.078545 24.455
#'{ sum = ($2 + $3 + $4) / 3; print $1, $2, $3, $4, sum }' merge.TPM:这是第一个awk命令,用于处理文件"merge.TPM"。首先,它将文件中第2至4列数字的平均值计算出来,并将结果存储在变量"sum"中。然后,它使用print命令打印出当前行的全部内容($0),并在末尾添加一个新的列,该列值为"sum"变量的值。这个新列是通过print $1, $2, $3, $4, sum命令实现的,它列出了当前行中的前4列,然后是计算得到的新列"sum"。
# awk '$5 >= 1':这是第二个awk命令,表示将第一个awk命令的输出作为管道输入,过滤出新添加列中值大于等于1的行。其中,$5表示第5列,即刚刚添加的列。$5 >= 1表示匹配值大于等于1的行。

第一列去重并输出

#输出第一列
awk '!seen[$1]++ {print $1}' data.txt
#!seen[$1]++:这是一个条件表达式,它使用数组"seen"来跟踪已经出现过的第一列的值。$1表示当前行的第一列。当表达式seen[$1]的值为0时,即该值尚未在数组"seen"中出现过时,表达式!seen[$1]的值为真。调用++运算符会将数组"seen"中对应元素的值加1。
#{print $1}:这是一个动作,当条件表达式的值为真时,即第一列的值的首次出现时,它会打印出当前行的第一列。

文件1中过滤出与文件2中第一列和第二列匹配的行

$head file1 file2
==> file1 <==
Gorai.001G002800
Gorai.001G067000
Gorai.001G072200
Gorai.001G143200
Gorai.001G144200
Gorai.001G148500
Gorai.001G177100
Gorai.001G183400
Gorai.001G199200
Gorai.001G200400
==> file2 <==
Gorai.001G002800        Gorai.001G004800
Gorai.001G002800        Gorai.001G013900
Gorai.001G002800        Gorai.001G029700
Gorai.001G002800        Gorai.001G042100
Gorai.001G002800        Gorai.001G049200
Gorai.001G002800        Gorai.001G049300
Gorai.001G002800        Gorai.001G103200
Gorai.001G002800        Gorai.001G127000
Gorai.001G002800        Gorai.001G148400
Gorai.001G002800        Gorai.001G149500

$awk 'FNR==NR {file1[$1]; next} ($1 in file1) && ($2 in file1)' file1 file2 | head
Gorai.001G067000        Gorai.001G199200
Gorai.001G067000        Gorai.001G207500
Gorai.001G067000        Gorai.002G052400
Gorai.001G067000        Gorai.002G171200
Gorai.001G067000        Gorai.003G021000
Gorai.001G067000        Gorai.004G181900
Gorai.001G067000        Gorai.004G208800
Gorai.001G067000        Gorai.004G268500
Gorai.001G067000        Gorai.005G015900
Gorai.001G067000        Gorai.008G192900
#FNR==NR {file1[$1]; next}:这是一个模式动作语句,用于处理第一个文件"file1"。当 awk 执行时,FNR(当前处理的行号) 等于 NR(总行号),这表示它正在处理第一个文件。在这个模式动作语句中,file1[$1]将第一个文件中的第一列值存储在数组file1中,next用于跳过后面的动作,以便处理下一行。
#($1 in file1) && ($2 in file1):这是一个模式,它匹配第二个文件"file2"中的每一行。($1 in file1)表示第二个文件中的第一列的值是否存在于数组file1中,($2 in file1)表示第二个文件中的第二列的值是否存在于数组file1中。只有在两个条件都满足时,该模式才会匹配。
#{print > "res"}:这是一个动作,当模式匹配时,它会将匹配的行打印并输出到文件"res"。

每隔4行提取行数

$head file
914
23bp
58.1℃
TTCAGAGGCGTCACCAGAAGATT
4035
25bp
57.8℃
ACTTGATGTTGACATGATGCGTAGT
1409
27bp
$awk 'NR%4==0' file | head
TTCAGAGGCGTCACCAGAAGATT
ACTTGATGTTGACATGATGCGTAGT
CCTTGCCTAATTCTTCTCATGTCAATG
GCAGAGAAATTGGCTGTTGACCT
CCCAACTCGTTCAATCTTTCTCAGT
TGAGTCATGCCACACACTTCCT
AGTGCTGAGCAACACAACCAAG
TGGAGGTTAAAGAAGCAGAGAGGAT
CCACAAGGAGTTGTTGGCATCTT
GAGGACGAACAGAAGAATCGGATG

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值