如何在Bash中从文件第7行提取指定内容并赋值给变量?
问题:提取指定行中的特定字段作为变量值
我有一个内容如下的文件file.txt:
>ref_frame=1 TPGIRYQYNVLPQGWKGSPAIFQSSMTKILEPFRKQNPDIVIYQYMDDLYVGSD >ref_frame=2 HQGLDISTMCFHRDGKDHQQYSKVA*QKS*SLLENKIQT*LSINTWMICM*DLT >ref_frame=3 TRD*ISVQCASTGMERITSNIPK*HDKNLRAF*KTKSRHSYLSIHG*FVCRI* >test_3_2960_3_frame=1 TPGIRYQYNVLPQGWKGSPAIFQSSMTKILEPSRKQNPDIVIYQYMDDLYVGSD
我需要在Bash中给变量赋值,执行echo $variable时输出test_3_2960。目标内容固定在第7行,目前使用的命令是:
variable=`cat file.txt | awk 'NR==7'`
执行后输出结果为>test_3_2960_3_frame=1,请问该如何实现需求?
解决方案
方法1:用awk直接完成定位与提取
可以在awk中一步完成行选择和字段提取,同时避免无用的cat管道:
variable=$(awk 'NR==7 {sub(/^>/, ""); split($0, arr, /[_=]/); print arr[1]"_"arr[2]"_"arr[3]}' file.txt)
NR==7:定位到第7行sub(/^>/, ""):移除行首的>符号split($0, arr, /[_=]/):用_和=作为分隔符拆分字符串为数组,此时arr[1]为test、arr[2]为3、arr[3]为2960- 最后拼接并打印目标字符串
方法2:结合sed与cut处理
先用sed定位行并移除>,再用cut分割提取指定字段:
variable=$(sed -n '7s/^>//p' file.txt | cut -d'_' -f1-3)
sed -n '7s/^>//p':仅处理第7行,替换行首的>并打印该行内容cut -d'_' -f1-3:以_为分隔符,提取前3个字段,拼接后即为test_3_2960
方法3:纯Bash内置命令处理(无需外部工具)
如果不想依赖awk/sed,可使用Bash原生字符串操作:
line=$(sed -n '7p' file.txt) variable=${line#>} # 移除字符串开头的> variable=${variable%_*_*} # 从末尾删除最后两个_及其后续内容
${line#>}:删除字符串开头的>字符${variable%_*_*}:从字符串末尾匹配并删除_*_*(即最后两个下划线及之后的所有内容)
内容的提问来源于stack exchange,提问作者SaltedPork
相关产品推荐
相关产品推荐

