如何使用 SED 编辑sample_ids



我有一个包含示例ID的文件。 我想生成一个示例参与者查找表,该表应有两列由选项卡分隔。第一列应为 GTEX-1117F-0226-SM-5GZZ7 GTEX-1117F 我能够从文件中获取第一个 ID:

grep "GTEX" gene_tpm_2017-06-05_v8_brain_cortex.gct | awk '{$1=$2=$3=$4=""; printf $0 }' | xargs -n1 > ids_bed.txt

现在我的ids_bed.txt文件如下所示:

GTEX-1117F-3226-SM-5N9CT
GTEX-111FC-3126-SM-5GZZ2
GTEX-1128S-2726-SM-5H12C
GTEX-117XS-3026-SM-5N9CA
GTEX-1192X-3126-SM-5N9BY
GTEX-11DXW-1126-SM-5H12Q

我想添加GTEX-1117F作为第二列,依此类推 我试图这样做:

sed -re 's/(GTEX-[[:alnum:]]+)_1/1/g' ids_bed.txt > ids_bed_1.txt

但它不会生成第二列。 我希望我的最终文件看起来像这样:两列都用制表符分隔:

GTEX-1117F-3226-SM-5N9CT GTEX-1117F
GTEX-111FC-3126-SM-5GZZ2 GTEX-111FC

如果您显示的样本(最后一个)是需要的最终输出,那么您只需尝试以下awk应该可以工作。

awk 'BEGIN{FS=OFS="-"} {print $0" "$1,$2}'  Input_file

说明:简单的解释是,将FSOFS设置为BEGIN部分中-。在主程序中打印当前行,后跟空格,第一个字段 OFS 和第二个字段。

$ awk -F'-' -v OFS='t' '{print $0, $1 FS $2}' ids_bed.txt
GTEX-1117F-3226-SM-5N9CT        GTEX-1117F
GTEX-111FC-3126-SM-5GZZ2        GTEX-111FC
GTEX-1128S-2726-SM-5H12C        GTEX-1128S
GTEX-117XS-3026-SM-5N9CA        GTEX-117XS
GTEX-1192X-3126-SM-5N9BY        GTEX-1192X
GTEX-11DXW-1126-SM-5H12Q        GTEX-11DXW

使用sed

$ sed -E 's/(.*)([^-]*-){3}.*/&t1/' input_file

使用awk

$awk -F'-' '{s=$1FS$2;$0=$0"t"s}1' OFS="-" input_file

输出

GTEX-1117F-3226-SM-5N9CT        GTEX-1117F
GTEX-111FC-3126-SM-5GZZ2        GTEX-111FC
GTEX-1128S-2726-SM-5H12C        GTEX-1128S
GTEX-117XS-3026-SM-5N9CA        GTEX-117XS
GTEX-1192X-3126-SM-5N9BY        GTEX-1192X
GTEX-11DXW-1126-SM-5H12Q        GTEX-11DXW

我会按照以下方式使用 GNUsed来完成此任务,让file.txt内容

GTEX-1117F-3226-SM-5N9CT
GTEX-111FC-3126-SM-5GZZ2
GTEX-1128S-2726-SM-5H12C
GTEX-117XS-3026-SM-5N9CA
GTEX-1192X-3126-SM-5N9BY
GTEX-11DXW-1126-SM-5H12Q

然后

sed 's/(GTEX-[^-]*)(.*)/12t1/' file.txt

给出输出

GTEX-1117F-3226-SM-5N9CT    GTEX-1117F
GTEX-111FC-3126-SM-5GZZ2    GTEX-111FC
GTEX-1128S-2726-SM-5H12C    GTEX-1128S
GTEX-117XS-3026-SM-5N9CA    GTEX-117XS
GTEX-1192X-3126-SM-5N9BY    GTEX-1192X
GTEX-11DXW-1126-SM-5H12Q    GTEX-11DXW

说明:我使用 2 个捕获组,一个用于 GTEX-(除 -) 之外的任何内容,一个用于行的其余部分。我用整行替换整行12这是整行,TAB 然后是第一组的内容。

(在 GNU sed 4.7 中测试)

另一个选项,awk使用与字符串开头的 GTEX 和 1+ 字母数字字符匹配的模式。

如果有匹配项,请打印整行加上匹配项。

awk 'match($0, /^GTEX-[[:alnum:]]+/) {
print $0, substr($0, RSTART, RLENGTH)
}' file

输出

GTEX-1117F-3226-SM-5N9CT GTEX-1117F
GTEX-111FC-3126-SM-5GZZ2 GTEX-111FC
GTEX-1128S-2726-SM-5H12C GTEX-1128S
GTEX-117XS-3026-SM-5N9CA GTEX-117XS
GTEX-1192X-3126-SM-5N9BY GTEX-1192X
GTEX-11DXW-1126-SM-5H12Q GTEX-11DXW

最新更新