1

我有一个 Bash 脚本问题,它对我来说不再重要,但仍然让我发疯,因为我想不通。

我试图通过命令行比较 CSV 文件的列数,并在这里找到了一些看起来很有希望的说明。原始命令运行良好,但每次创建别名的尝试都失败了。

原始命令行 - 工作!

头 -n 1 文件名.CSV | awk '{split($0, 件, ","); for (i=1; i<=length(pieces); i++) print pieces[i];}' | wc -l

前任。molsen@molsen-M14xR2:~/projects/ee-export$ head -n 1 ee-content.csv | awk '{split($0, 件, ","); for (i=1; i<=length(pieces); i++) print pieces[i];}' | wc -l

7

别名命令行 - 失败!

别名 csvcc="head -n 1 $1 | awk '{split($0, pieces, ","); for (i=1; i<=length(pieces); i++) print pieces[i];}' | wc -l"

前任。molsen@molsen-M14xR2:~/projects/ee-export$ csvcc ee-content.csv

awk:命令。行:1:{拆分(bash,碎片,,);for (i=1; i<=length(pieces); i++) print pieces[i];}

awk:命令。line:1: ^ 语法错误

awk:命令。行:1:{拆分(bash,碎片,,);for (i=1; i<=length(pieces); i++) print pieces[i];}

awk:命令。line:1: ^ 语法错误

awk:命令。行:1:{拆分(bash,碎片,,);for (i=1; i<=length(pieces); i++) print pieces[i];}

awk:命令。line:1: ^ 0 作为拆分 1023 ee-content.csv 的参数数量无效

我已经用不同的引用和转义尝试了这个命令的各种变体,但它们都会产生错误。我什至研究了强引用与弱引用,但没有发现任何有用的东西。另外,我想出了这个更简单的命令,但它以同样的方式失败:

使用 SED 的命令行 - 有效!

头-n 1 文件.csv | sed 's/\,/\n/g' | wc -l

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

7

使用 SED 的别名 - 失败(计数行,而不是列)

别名 csvcc="head -n 1 $1 | sed 's/\,/\n/g' | wc -l"

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

第1023章

谁能告诉我我在这里缺少什么?谢谢你的帮助!

4

2 回答 2

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 }'"
于 2013-11-06T09:02:48.903 回答
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。

将该行放入 bash 脚本文件中$HOME/bin/csvcc

#!/bin/bash
head -n 1  | sed 's/\,/\n/g' | wc -l

然后使脚本可执行:

chmod +x ~/bin/csvcc

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

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

用法:

csvcs ee-content.csv
于 2013-05-11T06:12:29.020 回答