如何用paste和awk提取首文件第1列与所有文件第2列?
需求与通用解决方法
需求说明
我有folder1_a和folder2_a两个文件夹,各自包含file.txt文件,每个文件都是2列6行格式。需要按列输出第一个文件的第1列,以及所有文件的第2列。手动指定$1、$2、$4这类字段可行,但文件数量增多时不想手动罗列所有列,需要通用方法。
尝试过的命令及问题
第一条命令(仅提取偶数列)
$ paste folder[1-2]*/file.txt | awk '{for (i=1;i<=NF;i+=2) $i=""}1' col2 col4 7 g 8 h 9 i 10 j 11 k 12 l
问题:只保留了所有偶数列,丢失了第一个文件的第1列。
第二条命令(内容错位)
$ paste folder[1-2]*/file.txt | awk '{print $1} {for (i=1;i<=NF;i+=2)}1' col1 col2 col4 1 7 g 2 8 h 3 9 i 4 10 j 5 11 k 6 12 l
问题:虽然输出了所需字段,但偶数列内容整体下移一行,格式混乱。
原始文件内容
folder1_a/file.txt
$ cat folder1_a/file.txt col1 col2 1 7 2 8 3 9 4 10 5 11 6 12
folder2_a/file.txt
$ cat folder2_a/file.txt col3 col4 a g b h c i d j e k f l
通用解决方案
方案1:直接用awk处理多文件
无需提前合并文件,自动适配任意数量的目标文件:
awk ' BEGIN { OFS="\t" } FNR == 1 { # 处理表头:第一个文件取第1列,所有文件取第2列 if (NR == FNR) printf "%s", $1; printf "%s%s", OFS, $2; next } { # 处理数据行:第一个文件取第1列,所有文件取第2列 if (NR == FNR) printf "%s", $1; printf "%s%s", OFS, $2; print "" } ' folder1_a/file.txt folder[2-]*_a/file.txt
方案2:paste配合awk(更简洁)
先合并文件再提取,同样支持文件数量扩展:
paste folder[1-2]*/file.txt | awk ' BEGIN { OFS="\t" } { # 输出第一个文件的第1列 printf "%s", $1; # 遍历所有文件的第2列(即第2、4、6...列) for (i=2; i<=NF; i+=2) { printf "%s%s", OFS, $i; } print "" } '
内容的提问来源于stack exchange,提问作者Guy
相关产品推荐
相关产品推荐

