AWK根据从第二个文件中select的标题从文件中提取列

我有以下问题,我想在awk中解决。 我有一个大的文本表,逗号分隔,由100k行和5k列组成。 第一行是一个标题,第一列是一个loggingID。 然后我有第二个文本文件,其中包含第一个文件中的标题的子集。 我想提取第一个文件的头部包含在第二个文件给出的列表中的所有列。 这里是一个input和所需输出的例子:

DATA.TXT

ID, head1, head2, head3, head4 1, 25.5, 1364.0, 22.5, 13.2 2, 10.1, 215.56, 1.15, 22.2 

LIST.TXT

 head1 head4 

期望的输出:

 ID, head1, head4 1, 25.5, 13.2 2, 10.1, 22.2 

任何人都可以给我一些如何解决这个问题在awk或通过unix脚本的build议吗? 提前感谢任何帮助!

我有一个想法,但由于我没有经验的shell编程(不知道awk),这看起来像一个荒谬的方式重塑一些车轮:

 $ cat DATA.TXT ID, head1, head2, head3, head4 1, 25.5, 1364.0, 22.5, 13.2 2, 10.1, 215.56, 1.15, 22.2 $ cat LIST.TXT head1 head4 $ cols=($(sed '1!d;s/, /\n/g' DATA.TXT | grep -nf LIST.TXT | sed 's/:.*$//')) $ cut -d ',' -f 1$(printf ",%s" "${cols[@]}") DATA.TXT ID, head1, head4 1, 25.5, 13.2 2, 10.1, 22.2 

PS我使用了一些非常基本的想法,从这个 bash数组, 这个答案。

这里有一个有用的awk脚本,您可以使用它从csv文件中提取特定的列名称。

我稍微修改了它,以便它可以从另一个文件中读取列名。 将下面的脚本保存为dataExtractor.sh

 #!/bin/bash DATAFILE=${1:-data.txt} COLUMNFILE=${2:-list.txt} awk -F, -v colsFile="$COLUMNFILE" ' BEGIN { j=1 while ((getline < colsFile) > 0) { col[j++] = $1 } n=j-1; close(colsFile) for (i=1; i<=n; i++) s[col[i]]=i } NR==1 { for (f=1; f<=NF; f++) if ($f in s) c[s[$f]]=f next } { sep="" for (f=1; f<=n; f++) { printf("%c%s",sep,$c[f]) sep=FS } print "" } ' "$DATAFILE" 

运行它:

 $ cat data.txt ID,head1,head2,head3,head4 1,25.5,1364.0,22.5,13.2 2,10.1,215.56,1.15,22.2 $ cat list.txt ID head1 head4 $ dataExtractor.sh data.txt list.txt 1,25.5,13.2 2,10.1,22.2