「wc」からの行を変数として使用したいと思います。例えば:
echo 'foo bar' > file.txt
echo 'blah blah blah' >> file.txt
wc file.txt
2 5 23 file.txt
$lines
、$words
、および$characters
の値に関連付けられている2
、5
、および23
のようなものが欲しいです。どうすればbashでそれを行うことができますか?
他の解決策もありますが、私が通常使用する簡単な解決策は、wc
の出力を一時ファイルに入れ、そこから読み取ることです。
wc file.txt > xxx
read lines words characters filename < xxx
echo "lines=$lines words=$words characters=$characters filename=$filename"
lines=2 words=5 characters=23 filename=file.txt
この方法の利点は、変数ごとに1つ、複数のawk
プロセスを作成する必要がないことです。欠点は、一時ファイルが必要なことです。このファイルは後で削除する必要があります。
注意:これは機能しません:
wc file.txt | read lines words characters filename
問題は、read
へのパイプが別のプロセスを作成し、変数がそこで更新されるため、呼び出し元のシェルでアクセスできないことです。
編集:arnaud576875によるソリューションの追加:
read lines words chars filename <<< $(wc x)
ファイルに書き込むことなく動作します(パイプの問題はありません)。これはbash固有です。
Bashマニュアルから:
Here Strings
A variant of here documents, the format is:
<<<Word
The Word is expanded and supplied to the command on its standard input.
キーは「Word is expand」ビットです。
純粋なbashの場合:(awkなし)
_a=($(wc file.txt))
lines=${a[0]}
words=${a[1]}
chars=${a[2]}
_
これは、bashの配列を使用して機能します。 a=(1 2 3)
は、要素1、2、および3の配列を作成します。その後、_${a[indice]}
_構文を使用して個別の要素にアクセスできます。
代替:(多角形のソリューションに基づく)
_read lines words chars <<< $(wc x)
_
またはshで:
_a=$(wc file.txt)
lines=$(echo $a|cut -d' ' -f1)
words=$(echo $a|cut -d' ' -f2)
chars=$(echo $a|cut -d' ' -f3)
_
別のバリアントを追加するだけです-
set -- `wc file.txt`
chars=$1
words=$2
lines=$3
これは明らかに_$*
および関連変数。ここの他のソリューションの一部とは異なり、他のBourneシェルに移植できます。
変数にcsvファイルの数を保存したかった。次は私のために働いた:
CSV_COUNT=$(ls ./pathToSubdirectory | grep ".csv" | wc -l | xargs)
lines=`wc file.txt | awk '{print $1}'`
words=`wc file.txt | awk '{print $2}'`
...
wc
の結果を最初にどこかに保存してから解析することもできます。パフォーマンスにこだわりがある場合:)
サブシェルを開くと、変数に出力を割り当てることができます。
$ x=$(wc some-file)
$ echo $x
1 6 60 some-file
ここで、個別の変数を取得するための最も簡単なオプションは、awk
を使用することです。
$ x=$(wc some-file | awk '{print $1}')
$ echo $x
1
declare -a result
result=( $(wc < file.txt) )
lines=${result[0]}
words=${result[1]}
characters=${result[2]}
echo "Lines: $lines, Words: $words, Characters: $characters"