【发布时间】:2017-01-07 15:36:00
【问题描述】:
我正在尝试获取 csv 文件的特定列(以防 Header 包含“SOF”)。是一个大文件,我需要使用 Shell 将此列复制到另一个 csv 文件。
我尝试过这样的事情:
#!/bin/bash
awk ' {
i=1
j=1
while ( NR==1 )
if ( "$i" ~ /SOF/ )
then
array[j] = $i
$j += 1
fi
$i += 1
for ( k in array )
print array[k]
}' fil1.csv > result.csv
在这种情况下,我尝试将标题中包含“SOF”的列号保存在数组中。之后使用此数字复制列。
【问题讨论】:
-
请注意,在 awk 中循环遍历数组是这样完成的:
for (item in array)。您目前正在使用 Basy 语法。 -
你完全误解了 awk 的语法和语义。 awk 不是 shell,它是一个完全不同的工具,有自己的语言。获取 Arnold Robbins 的《Effective Awk Programming, 4th Edition》一书,并开始研究前几个示例。
-
感谢@fedorqui,但仍然无法正常工作:(,我认为我的逻辑是正确的,但结果 csv 为空,并且脚本正在循环运行...
-
正如@EdMorton 建议的那样,从一个小例子开始,因为您在这里混合了许多基本概念。
-
关键字
contains、then和fi不是awk中的关键字。对于contains,您可能需要一个正则表达式和~;其余的只需要从 shell-ish 转换为 Awk。此外,Awk 中的$i与 shell 中的$i非常不同。