加入收藏 | 设为首页 | 会员中心 | 我要投稿 商洛站长网 (https://www.0914zz.com/)- AI应用、CDN、边缘计算、云计算、物联网!
当前位置: 首页 > 综合聚焦 > Linux > 正文

linux – 如何从多个文件中提取一列,并将这些列粘贴到一个文件中?

发布时间:2020-12-30 12:31:57 所属栏目:Linux 来源:互联网
导读:我想从多个文件中提取第5列,按数字顺序命名,并将这些列按顺序粘贴到一个输出文件中. 文件名看起来像: sample_problem1_part1.txtsample_problem1_part2.txtsample_problem2_part1.txtsample_problem2_part2.txtsample_problem3_part1.txtsample_problem3_p

我想从多个文件中提取第5列,按数字顺序命名,并将这些列按顺序粘贴到一个输出文件中.

文件名看起来像:

sample_problem1_part1.txt
sample_problem1_part2.txt

sample_problem2_part1.txt
sample_problem2_part2.txt

sample_problem3_part1.txt
sample_problem3_part2.txt
......

每个问题文件(1,2,3 ……)都有两个部分(第1部分,第2部分).每个文件具有相同的行数.
内容如下:

sample_problem1_part1.txt
1 1 20 20 1
1 7 21 21 2
3 1 22 22 3
1 5 23 23 4
6 1 24 24 5
2 9 25 25 6
1 0 26 26 7

sample_problem1_part2.txt
1 1 88 88 8
1 1 89 89 9
2 1 90 90 10
1 3 91 91 11
1 1 92 92 12
7 1 93 93 13
1 5 94 94 14

sample_problem2_part1.txt
1 4 330 30 a
3 4 331 31 b
1 4 332 32 c
2 4 333 33 d
1 4 334 34 e
1 4 335 35 f
9 4 336 36 g

输出应如下所示:(在problem1_part1,problem1_part2,problem2_part1,problem2_part2,problem3_part1,problem3_part2等的序列中)

1 8 a ...
2 9 b ...
3 10 c ...
4 11 d ...
5 12 e ...
6 13 f ...
7 14 g ...

我用的是:

paste sample_problem1_part1.txt sample_problem1_part2.txt > 
     sample_problem1_partall.txt
 paste sample_problem2_part1.txt sample_problem2_part2.txt > 
     sample_problem2_partall.txt
 paste sample_problem3_part1.txt sample_problem3_part2.txt > 
     sample_problem3_partall.txt

然后:

for i in `find . -name "sample_problem*_partall.txt"`
do
    l=`echo $i | sed 's/sample/extracted_col_/'`
    `awk '{print $5,$10}'  $i > $l`
done

和:

paste extracted_col_problem1_partall.txt 
      extracted_col_problem2_partall.txt 
      extracted_col_problem3_partall.txt > 
    extracted_col_problemall_partall.txt

它适用于一些文件,但是当文件数量很大(超过4000)时,它是一种疯狂的方法.
有人能帮我解决一些能够处理多个文件的简单解决方案吗?
谢谢!

解决方法

这是使用awk和排序文件的一种方式的一种方式:
awk '{ a[FNR] = (a[FNR] ? a[FNR] FS : "") $5 } END { for(i=1;i<=FNR;i++) print a[i] }' $(ls -1v *)

结果:

1 8 a
2 9 b
3 10 c
4 11 d
5 12 e
6 13 f
7 14 g

说明:

>对于每个输入文件的每行输入:

>将文件行号添加到值为列5的数组中.
>(a [FNR]?a [FNR] FS:“”)是三元运算,设置为将数组值构建为记录.它只是询问文件行号是否已经在数组中.如果是这样,请在添加第五列之前添加数组值,然后添加默认文件分隔符.否则,如果行号不在数组中,请不要添加任何内容,只需将其等于第五列即可.

>在脚本结束时:

>使用C风格循环迭代数组,打印每个数组值.

(编辑:商洛站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读