1

Bash スクリプトに関する質問がありますが、それはもはや重要ではありませんが、理解できないため、いまだに気が狂いそうになっています。

コマンド ラインを使用して CSV ファイルの列数を比較しようとしていたところ、見込みのある手順がいくつか見つかりました。元のコマンドは完全に機能しましたが、エイリアスを作成する試みはすべて失敗しました。

オリジナルのコマンドライン - WORKS!

head -n 1 ファイル名.CSV | awk '{split($0, 個, ","); for (i=1; i<=length(pieces); i++) print pieces[i];}' | トイレ -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];}' | トイレ -l

7

コマンドラインのエイリアス - 失敗!

alias 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: cmd. line:1: {split(bash, pieces, ,); for (i=1; i<=length(pieces); i++) print pieces[i];}

awk: cmd. 行:1: ^ 構文エラー

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

awk: cmd. 行:1: ^ 構文エラー

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

awk: cmd. line:1: 分割 1023 ee-content.csv の引数の数として ^ 0 は無効です

さまざまな引用符とエスケープを使用して、このコマンドであらゆる種類のバリエーションを試しましたが、すべてエラーが発生します。強い引用と弱い引用についても調べましたが、役立つものは何も見つかりませんでした。また、このより単純なコマンドを思いつきましたが、同じように失敗します。

SED を使用したコマンドライン - 動作します!

head -n 1 file.csv | sed 's/\,/\n/g' | トイレ -l

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

7

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

ここで何が欠けているのか誰か教えてもらえますか? ご協力いただきありがとうございます!

4

2 に答える 2

1

csvcc <ee-content.csvrzymek のソリューション 1 は、次のように展開されるため機能しません。

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

デフォルトでubuntu$HOME/binに追加さ$PATHれます。システムにない場合は、次の行をに追加します~/.profile

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

使用法:

csvcs ee-content.csv
于 2013-05-11T06:12:29.020 に答える