我有一个由制表符分隔的文件,如下所示:
cg13201342 F ARNT;ARNT;ARNT;CTSK 3'UTR;3'UTR;3'UTR;TSS1500
cg05269359 F SCN4B;SCN4B;SCN4B;SCN4B 3'UTR;3'UTR;3'UTR;Body
cg06018296 R NEK3;NEK3;NEK3;NEK3 3'UTR;3'UTR;3'UTR;Body
cg05172994 F WDR20;WDR20;WDR20;WDR20 3'UTR;3'UTR;3'UTR;Body期望产出:
cg13201342 F ARNT 3'UTR
cg13201342 F ARNT 3'UTR
cg13201342 F ARNT 3'UTR
cg13201342 F CTSK TSS1500
cg05269359 F SCN4B 3'UTR
.
.诸若此类
我试过了
awk 'BEGIN {
FS = OFS = "\t"
}
{
n = split($3, f, " *;*")
for (i=1; i<=n; i++)
print $1, f[i]
}' probe-genes-regions >chk但这只是分裂了第三列。我希望最后一列与第二列分开,分别用第三列的第一字段和最后一列的第一字段形成行,等等。
发布于 2022-08-24 10:04:28
将分号上的字段3和4分割成单独的数组,然后在它们上迭代,例如(假设字段3和4有相同数量的元素):
parse.awk
BEGIN { OFS = "\t" }
{
n = split($3, a, /;/); split($4, b, /;/)
for(i=1; i<=n; i++)
print $1, $2, a[i], b[i]
}像这样运行:
awk -f parse.awk infile输出:
cg13201342 F ARNT 3'UTR
cg13201342 F ARNT 3'UTR
cg13201342 F ARNT 3'UTR
cg13201342 F CTSK TSS1500
cg05269359 F SCN4B 3'UTR
cg05269359 F SCN4B 3'UTR
cg05269359 F SCN4B 3'UTR
cg05269359 F SCN4B Body
cg06018296 R NEK3 3'UTR
cg06018296 R NEK3 3'UTR
cg06018296 R NEK3 3'UTR
cg06018296 R NEK3 Body
cg05172994 F WDR20 3'UTR
cg05172994 F WDR20 3'UTR
cg05172994 F WDR20 3'UTR
cg05172994 F WDR20 Body发布于 2022-08-24 13:11:01
使用任何POSIX awk,不管输入中的空格是什么:
$ awk -F'[[:space:];]+' -v OFS='\t' '{
n=(NF-2)/2; for (i=1; i<=n; i++) print $1, $2, $(2+i), $(2+i+n)
}' file
cg13201342 F ARNT 3'UTR
cg13201342 F ARNT 3'UTR
cg13201342 F ARNT 3'UTR
cg13201342 F CTSK TSS1500
cg05269359 F SCN4B 3'UTR
cg05269359 F SCN4B 3'UTR
cg05269359 F SCN4B 3'UTR
cg05269359 F SCN4B Body
cg06018296 R NEK3 3'UTR
cg06018296 R NEK3 3'UTR
cg06018296 R NEK3 3'UTR
cg06018296 R NEK3 Body
cg05172994 F WDR20 3'UTR
cg05172994 F WDR20 3'UTR
cg05172994 F WDR20 3'UTR
cg05172994 F WDR20 Bodyhttps://unix.stackexchange.com/questions/714687
复制相似问题