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
?
下面的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
.