You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 08:17:39