linux – 如何从多个文件中提取一列,并将这些列粘贴到一个文件中
发布时间:2020-12-13 19:52:00 所属栏目:Linux 来源:网络整理
导读:我想从多个文件中提取第5列,按数字顺序命名,并将这些列按顺序粘贴到一个输出文件中. 文件名看起来像: sample_problem1_part1.txtsample_problem1_part2.txtsample_problem2_part1.txtsample_problem2_part2.txtsample_problem3_part1.txtsample_problem3_pa
我想从多个文件中提取第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的数组中. >在脚本结束时: >使用C风格循环迭代数组,打印每个数组值. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |