如何提取其列名与 CSV 文件的特定模式匹配的整个列?

Jia*_*wen 0 text-processing csv

我对 Unix 不太熟悉,现在正在处理一个非常大的 CSV 文件。

下面是一个例子:

ABC1,ABC2,ABC3,DDD,EEE,FFF
1,2,3,4,5,6
1,2,3,4,5,6
Run Code Online (Sandbox Code Playgroud)

如何提取所有以 开头的列ABC

Adm*_*Bee 5

下面的awk程序就可以了。将它存储在一个文件中,例如extract.awk

#!/bin/awk -f

BEGIN { FS=OFS=","}

FNR==1 {
  for (i=1;i<=NF;i++) {
    if (index($i,startstr)==1) cols[++ncol]=i;
  }
}

{ for (j=1;j<=ncol;j++) printf("%s%s",$(cols[j]),j==ncol?ORS:OFS) }
Run Code Online (Sandbox Code Playgroud)

然后你会称它为

~$ awk -f extract.awk -v startstr="ABC" input.csv
ABC1,ABC2,ABC3
1,2,3
1,2,3
Run Code Online (Sandbox Code Playgroud)

在变量中定义要查找的字符串的位置startstr

这将首先将输入和输出字段分隔符设置为,

  • 在第一行(标题)中,它将检查是否有任何列名称以您的搜索字符串开头,该字符串存储在变量startstr. 如果是这样,列号将被添加到cols“要打印的列”的数组中。
  • 对于每一行(包括第一行),它将打印存储在 中的所有列的值cols,然后是字段分隔符或记录分隔符(默认为换行符),如果它是要打印的最后一列。

请注意,我们使用index()函数awk而不是基于正则表达式的匹配来使用文字字符串匹配,以防您的实际搜索字符串包含在正则表达式上下文中特殊的字符。如果您必须使用正则表达式基本搜索,请更改

~$ awk -f extract.awk -v startstr="ABC" input.csv
ABC1,ABC2,ABC3
1,2,3
1,2,3
Run Code Online (Sandbox Code Playgroud)

if (index($i,startstr)==1) cols[++ncol]=i;
Run Code Online (Sandbox Code Playgroud)

但请注意,所有字符startstr都将被解释为正则表达式标记,如果不小心,可能会导致意外行为。对于您提到的示例,startstr将是^ABC.