根据列名提取指定列 shell awk

 

例子文件

colname.txt

enzyme    sample1    sample2    sample3    sample4    sample5
1    2    2    3    4    5
2    2    4    6    8    8
3    4    7    8    9    10
4    5    2    5    9    0

只想要提取sample1和sample5还有enzyme的数据 

 

从网上搜到的方法, 首先建立一个awk的脚本 叫select.awk 内容如下:

这里的cols是提取的列名字, 这里的input是输入的文件

BEGIN {
    split(cols,array,",") # 分割cols这个变量 到out这个array里
}
NR==1 {
    for (i=1; i<=NF; i++) # 读取第一行,i是从1开始一直到input文件的最后一列
        ix[$i] = i # ix[$1]=1 也就是说 ix[enzyme]= 1 这样就有对应的列名 所对应的列是第几列.
}
NR>=1 {
    for(i=1; i <= length(array); i++) # 遍历col给提供的参数
	   # print the OFS as a character
        printf "%s%s", $ix[array[i]], OFS #$ix[array[1]] -> $ix[enzyme]-> $1 得到所对应的数值
    print ""
}

输出文件

enzyme sample1 sample5 
1 2 5 
2 2 8 
3 4 10 
4 5 0 

这样就可以提取指定列了.

 

 

 

补充几个小科普

1. awk 里面的 NR==1 , 是指的第一行

echo -e "test test\ntest1 test1"|awk 'NR==1 {print $1}'

输出: test (这个指令是说输出第一行的第一列)

2. awk split 分割字符串

echo "test1|test2|test3" | awk '{split($0,a,"|"); print a[3],a[2],a[1]}'

zhidignliele输出

test3 test2 test1
 

3. awk -f 

-f 指的是--file progfile

 

4. printf 输出

s 表示输出一个字符串 

 

5. BEGIN/END简单用法,就是在执行具体操作之前,执行的操作,简单来说语句是下面的格式 

awk '
 	BEGIN { actions } 
 	/pattern/ { actions }
 	/pattern/ { actions }
            ……….
	 END { actions } 
' filenames 

example

下面是testfile.com这个文件

cat testfile.com 
www.apple.com
www.banana.com
www.orange.com
www.watermelon.com
www.kiwi.com
www.grape.com
www.avocado.com
www.cantaloupe.com

我想要在输出这个文件之前打印这些都是水果, 命令行如下

awk 'BEGIN {print "those are all fruits:"} {print $0} ' testfile.com 

输出结果:

those are all fruits:
www.apple.com
www.banana.com
www.orange.com
www.watermelon.com
www.kiwi.com
www.grape.com
www.avocado.com
www.cantaloupe.com

如果加patter,只输出以包括a字母的水果, 这里的/a/ 就是上文所对应的pattern

awk 'BEGIN {print "those are all fruits:"} /a/ {print $0} ' testfile.com  
those are all fruits:
www.apple.com
www.banana.com
www.orange.com
www.watermelon.com
www.grape.com
www.avocado.com
www.cantaloupe.com

如果是想在结尾再加上 this is the end 语句,则 见下面例子 

awk 'BEGIN {print "those are all fruits:"; } /a/ {print $0; } END {print "this is the end";}' testfile.com  
those are all fruits:
www.apple.com
www.banana.com
www.orange.com
www.watermelon.com
www.grape.com
www.avocado.com
www.cantaloupe.com
this is the end

 

参考ref

https://www.tecmint.com/learn-use-awk-special-patterns-begin-and-end/

https://stackoverflow.com/questions/8009664/how-to-split-a-delimited-string-into-an-array-in-awk

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值