例子文件
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