CSV列通过命令行别名计数

时间:2013-05-11 00:47:59

标签: bash ubuntu csv scripting command-line-interface

我有一个Bash脚本问题,对我来说不再重要,但仍然让我发疯,因为我无法理解。

我试图通过命令行比较CSV文件的列数,并发现一些看起来很有希望的说明here。原始命令工作正常,但每次创建别名的尝试都失败了。

原始命令行 - WORKS!

head -n 1 FILENAME.CSV | awk'{split($ 0,pieces,“,”); for(i = 1; i&lt; = length(pieces); i ++)print pieces [i];}'| wc -l <​​/ strong>

实施例。 molsen @molsen-M14xR2:〜/ projects / ee-export $ head -n 1 ee-content.csv | awk'{split($ 0,pieces,“,”); for(i = 1; i&lt; = length(pieces); i ++)print pieces [i];}'| wc -l <​​/ p>

7

别名命令行 - 失败!

alias csvcc =“head -n 1 $ 1 | awk'{split($ 0,pieces,”,“); for(i = 1; i&lt; = length(pieces); i ++)print pieces [i ];}'| wc -l“

实施例。 molsen @ molsen-M14xR2:〜/ projects / ee-export $ csvcc ee-content.csv

awk:cmd。 line:1:{split(bash,pieces ,,); for(i = 1; i&lt; = length(pieces); i ++)print pieces [i];}

awk:cmd。 line:1:^语法错误

awk:cmd。 line:1:{split(bash,pieces ,,); for(i = 1; i&lt; = length(pieces); i ++)print pieces [i];}

awk:cmd。 line:1:^语法错误

awk:cmd。 line:1:{split(bash,pieces ,,); for(i = 1; i&lt; = length(pieces); i ++)print pieces [i];}

awk:cmd。 line:1:^ 0作为split的参数个数无效 1023 ee-content.csv

我已尝试使用不同的引用和转义来对此命令进行各种变化,但它们都会产生错误。我甚至调查了strong vs. weak quoting,但没有找到任何有用的东西。此外,我提出了这个更简单的命令,但它以同样的方式失败:

使用SED的命令行 - 工作!

head -n 1 file.csv | sed's / \,/ \ n / g'| wc -l <​​/ strong>

molsen @ molsen-M14xR2:〜/ projects / ee-export $ head -n 1 ee-content.csv | sed's / \,/ \ n / g'| wc -l <​​/ p>

7

ALIAS使用SED - 失败(计算线,而不是列)

alias csvcc =“head -n 1 $ 1 | sed's / \,/ \ n / g'| wc -l”

molsen @ molsen-M14xR2:〜/ projects / ee-export $ csvcc ee-content.csv

1023 ee-content.csv

任何人都可以告诉我这里缺少什么吗?谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

rzymek的解决方案1不起作用,因为csvcc <ee-content.csv扩展到

head -n 1 | sed 's/\,/\n/g' | wc -l <ee-content.csv

我。例如,输入文件不会输入head,而是输入wc -l;这就解释了为什么它给出了行数。

另一个带别名和awk的解决方案:

 alias csvcc="awk -F, 'NR==1 { print NF }'"

答案 1 :(得分:0)

别名不使用$1,脚本可以。

解决方案1。

alias csvcc="head -n 1  | sed 's/\,/\n/g' | wc -l"
                       ^--- no $1, input will be read from stdin

用法:

csvcs < ee-content.csv

解决方案2。

将该行放在$HOME/bin/csvcc

中的bash脚本文件中
#!/bin/bash
head -n 1  | sed 's/\,/\n/g' | wc -l

然后使脚本可执行:

chmod +x ~/bin/csvcc

默认情况下,ubuntu $HOME/bin已添加到$PATH。如果它不在您的系统上,请将此行添加到~/.profile

export PATH="$HOME/bin:$PATH"

用法:

csvcs ee-content.csv