首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >复制文件中的所有列

复制文件中的所有列
EN

Stack Overflow用户
提问于 2019-03-05 01:58:51
回答 4查看 51关注 0票数 0

我正在尝试复制文件中的所有列。我的文件非常大,包含600,000列和300行制表符分隔。在这里,我只是展示了我正在尝试处理的文件的一小部分。

rs      71_1203 71_1299 71_6634
40896   3       3       4
70786   2       2       4
116950  2       2       4
5891    3       3       4
6254    3       2       4
89308   2       2       4
116953  2       2       4
116956  2       2       4
20709   3       2       4
12524   2       2       4
12603   2       2       4
21074   2       2       1
42672   2       2       4
40972   2       2       4
21727   3       2       4
22163   2       2       4
22417   2       2       4
41216   2       2       4
41374   2       2       4

现在我希望我的文件看起来像这样:

rs      rs      71_1203 71_1203 71_1299 71_1299 71_6634 71_6634
40896   40896   3       3       3       3       4       4
70786   70786   2       2       2       2       4       4
116950  116950  2       2       2       2       4       4
5891    5891    3       3       3       3       4       4
6254    6254    3       3       2       2       4       4
89308   89308   2       2       2       2       4       4
116953  116953  2       2       2       2       4       4
116956  116956  2       2       2       2       4       4
20709   20709   3       3       2       2       4       4
12524   12524   2       2       2       2       4       4
12603   12603   2       2       2       2       4       4
21074   21074   2       2       2       2       1       1
42672   42672   2       2       2       2       4       4
40972   40972   2       2       2       2       4       4
21727   21727   3       3       2       2       4       4
22163   22163   2       2       2       2       4       4
22417   22417   2       2       2       2       4       4
41216   41216   2       2       2       2       4       4
41374   41374   2       2       2       2       4       4

所有列都重复。我使用awk命令实现了这一点-

awk 'BEGIN{FS=OFS="\t"} {$1 = $1 OFS $1} 1' try.txt | 
awk 'BEGIN{FS=OFS="\t"} {$3 = $3 OFS $3} 1' |
awk 'BEGIN{FS=OFS="\t"} {$5 = $5 OFS $5} 1' | 
awk 'BEGIN{FS=OFS="\t"} {$7 = $7 OFS $7} 1'

我知道当我们的文件很小时,这个命令很好用,但我的文件有600,000列,这种方式肯定不会起作用。

有人能帮我一下吗?这是一种简单的方法。

非常感谢你的帮助

EN

回答 4

Stack Overflow用户

发布于 2019-03-05 04:13:20

您可以尝试使用Perl单行

 perl -lpe 's/$/\t/g; s/(\S+\s*)/$1$1/g '  input_file

使用给定的输入

$ cat rhkss.txt
rs      71_1203 71_1299 71_6634
40896   3       3       4
70786   2       2       4
116950  2       2       4
5891    3       3       4
6254    3       2       4
89308   2       2       4
116953  2       2       4
116956  2       2       4
20709   3       2       4
12524   2       2       4
12603   2       2       4
21074   2       2       1
42672   2       2       4
40972   2       2       4
21727   3       2       4
22163   2       2       4
22417   2       2       4
41216   2       2       4
41374   2       2       4

$ perl -lpe 's/$/\t/g; s/(\S+\s*)/$1$1/g ' rhkss.txt
rs      rs      71_1203 71_1203 71_1299 71_1299 71_6634 71_6634
40896   40896   3       3       3       3       4       4
70786   70786   2       2       2       2       4       4
116950  116950  2       2       2       2       4       4
5891    5891    3       3       3       3       4       4
6254    6254    3       3       2       2       4       4
89308   89308   2       2       2       2       4       4
116953  116953  2       2       2       2       4       4
116956  116956  2       2       2       2       4       4
20709   20709   3       3       2       2       4       4
12524   12524   2       2       2       2       4       4
12603   12603   2       2       2       2       4       4
21074   21074   2       2       2       2       1       1
42672   42672   2       2       2       2       4       4
40972   40972   2       2       2       2       4       4
21727   21727   3       3       2       2       4       4
22163   22163   2       2       2       2       4       4
22417   22417   2       2       2       2       4       4
41216   41216   2       2       2       2       4       4
41374   41374   2       2       2       2       4       4

$
票数 2
EN

Stack Overflow用户

发布于 2019-03-05 02:11:22

您可以使用此awk复制用制表符分隔的所有列:

awk 'BEGIN{FS=OFS="\t"} {
     for (i=1; i<=NF; i++) printf "%s%s", $i OFS, $i (i < NF ? OFS : RS)}' file

rs  rs  71_1203 71_1203 71_1299 71_1299 71_6634 71_6634
40896   40896   3   3   3   3   4   4
70786   70786   2   2   2   2   4   4
116950  116950  2   2   2   2   4   4
5891    5891    3   3   3   3   4   4
6254    6254    3   3   2   2   4   4
89308   89308   2   2   2   2   4   4
116953  116953  2   2   2   2   4   4
116956  116956  2   2   2   2   4   4
20709   20709   3   3   2   2   4   4
12524   12524   2   2   2   2   4   4
12603   12603   2   2   2   2   4   4
21074   21074   2   2   2   2   1   1
42672   42672   2   2   2   2   4   4
40972   40972   2   2   2   2   4   4
21727   21727   3   3   2   2   4   4
22163   22163   2   2   2   2   4   4
22417   22417   2   2   2   2   4   4
41216   41216   2   2   2   2   4   4
41374   41374   2   2   2   2   4   4
票数 1
EN

Stack Overflow用户

发布于 2019-03-05 02:06:23

使用awk:

$ awk -v OFS="\t" '{
    for(i=NF*2;i>1;i--)                                        # from NF*2 down to 2
        $i=((j=i/2)==int(j)?$j:$(++j))                         # $i=$(ceil(1/2))
}1' file

输出:

rs      rs      71_1203 71_1203 71_1299 71_1299 71_6634 71_6634
40896   40896   3       3       3       3       4       4
70786   70786   2       2       2       2       4       4
...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54988956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档