如何仅打印每行中以特定字符开头的部分

如何仅打印每行中以特定字符开头的部分

我有一个超过 10,000 行的文件:

head samples   
https://genomequebec.mcgill.ca/nanuqMPS/readSetMd5Download/id/192170/type/READ_SET_FASTQ/filename/HI.2613.007.Custom_0022.ED9_SD2A27-1_180_R1.fastq.gz.md5
https://genomequebec.mcgill.ca/nanuqMPS/readSetMd5Download/id/192170/type/READ_SET_FASTQ_PE/filename/HI.2613.007.Custom_0022.ED9_SD2A27-1_180_R2.fastq.gz.md5
https://genomequebec.mcgill.ca/nanuqMPS/readSetMd5Download/id/192171/type/READ_SET_FASTQ/filename/HI.2613.007.Custom_0021.ED4_KS1A29-7_338_R1.fastq.gz.md5
https://genomequebec.mcgill.ca/nanuqMPS/readSetMd5Download/id/192171/type/READ_SET_FASTQ_PE/filename/HI.2613.007.Custom_0021.ED4_KS1A29-7_338_R2.fastq.gz.md5
https://genomequebec.mcgill.ca/nanuqMPS/readSetMd5Download/id/192168/type/READ_SET_FASTQ/filename/HI.2613.007.Index_18.ED17_MO1A26-7_353_R1.fastq.gz.md5
https://genomequebec.mcgill.ca/nanuqMPS/readSetMd5Download/id/192168/type/READ_SET_FASTQ_PE/filename/HI.2613.007.Index_18.ED17_MO1A26-7_353_R2.fastq.gz.md5
https://genomequebec.mcgill.ca/nanuqMPS/readSetMd5Download/id/192169/type/READ_SET_FASTQ/filename/HI.2613.007.Index_14.ED14_IA2A35-2_310_R1.fastq.gz.md5

我只想打印以“HI.*”开头的每行的一部分

这是我想要的输出:

HI.2613.007.Custom_0022.ED9_SD2A27-1_180_R1.fastq.gz
HI.2613.007.Custom_0022.ED9_SD2A27-1_180_R2.fastq.gz
HI.2613.007.Custom_0021.ED4_KS1A29-7_338_R1.fastq.gz
HI.2613.007.Custom_0021.ED4_KS1A29-7_338_R2.fastq.gz
HI.2613.007.Index_18.ED17_MO1A26-7_353_R1.fastq.gz
HI.2613.007.Index_18.ED17_MO1A26-7_353_R2.fastq.gz

答案1

使用awk

awk -F'/' '$NF ~ /^HI\./{ print $NF }' infile

要删除.md5后缀,您可以执行以下操作:

awk -F'(/|.md5)' '$(NF-1) ~ /^HI\./{ print $(NF-1) }' infile
  • 在 中awk$0指的是整行/记录$1, , $2, $3, ... 分别指的是第一,第二,第三,... ;并$NF指最后一个字段,因此$(NF-1)是倒数第二个字段。

  • awk 中的tild~运算符将右侧运算符视为(扩展)正则表达式,将左侧操作数视为字符串string ~ /regular-expression/

解决方案sed

sed 's:.*/\([^/]*\)\.md5$:\1: ; /^HI\./!d' infile
  • /\([^/]*\)\.md5与最后一个斜杠后跟任何内容匹配,但不匹配以 结尾的斜杠.md5。我们将\([^/]*\)(最后一个斜杠和之间的所有内容.md5作为组匹配,并在替换部分中打印其反向引用\1

  • 这将从上一个命令的结果中/^HI\./!d删除不以开头的行。HI.sed

  • 由于输入中有特殊字符,因此我们使用了不同的sed分隔符。:/

答案2

尝试这个,

awk -F '/' '$NF ~ /^HI/ {print substr($NF, 1, length($NF)-4)}' file.txt
  • 如果最后一个字段以以下内容开头,则打印最后一个字段HI
  • 排除最后 4 个字符.md5

输出

HI.2613.007.Custom_0022.ED9_SD2A27-1_180_R1.fastq.gz
HI.2613.007.Custom_0022.ED9_SD2A27-1_180_R2.fastq.gz
HI.2613.007.Custom_0021.ED4_KS1A29-7_338_R1.fastq.gz
HI.2613.007.Custom_0021.ED4_KS1A29-7_338_R2.fastq.gz
HI.2613.007.Index_18.ED17_MO1A26-7_353_R1.fastq.gz
HI.2613.007.Index_18.ED17_MO1A26-7_353_R2.fastq.gz
HI.2613.007.Index_14.ED14_IA2A35-2_310_R1.fastq.gz

答案3

awk -F"filename/" '{gsub (".md5","");print $2}'

相关内容