0

csv ファイルの 3 行目から 16 列目を抽出し、最初の 4 文字を出力する awk コマンドがあります。

awk -F"," 'NR==3{print $16}' sample.csv|sed -e 's/^[ \t]*//'|awk '{print substr($0,0,4)}'

これはうまくいきます。

しかし、シェルスクリプトから実行すると、エラーが発生します

#!/bin/ksh
YEAR=awk -F"," 'NR==3{print $16}' sample.csv|sed -e 's/^[ \t]*//'|awk '{print substr($0,0,4)}'

エラーメッセージ:

 -F,: not found
4

4 に答える 4

2

以下に示すように、コマンド置換を使用して、コマンドの出力を変数に割り当てます。

YEAR=$(awk -F"," 'NR==3{print $16}' sample.csv|sed -e 's/^[ \t]*//'|awk '{print substr($0,0,4)}')
于 2013-02-04T17:08:46.250 に答える
0

これを行う:

year=$(awk -F, 'NR==3{sub(/^[ \t]+/,"",$16); print substr($16,1,4); exit }' sample.csv)
于 2013-02-04T18:05:29.697 に答える
0

あなたの説明から、先頭のスペースが含まれている可能性がある 16 番目のフィールドから年を抽出したいようです。AWK を 1 回呼び出すことで実現できます。

YEAR=$(awk -F, 'NR==3{sub(/^[ \t]*/, "", $16); print ">" substr($16,1,4) "<" }')

さらに良いことに、awk を使用する必要さえありません。すでにシェルスクリプトを書いているので、すべてシェルスクリプトで行いましょう:

{ read line; read line; read line; } < sample.csv # Get the third line
IFS=, set $line   # Breaks line into comma-separated fields
IFS=" " set ${16} # Trick to remove leading spaces, field 16 becomes field 1
YEAR=${1:0:4}     # Extract the first 4 char from field 1
于 2013-02-04T17:34:00.463 に答える
0

あなたはシェルに次のことを求めています:

VAR=value command [arguments...]

つまり、起動しますが、最初に環境 commandを渡します (例: : に数値が入ります(そして、変数は の呼び出しの間だけに設定されます)VAR=valueLC_ALL=C grep '[0-9]*' /some/file.txtgrepfile.txtLC_ALLCgrep

したがって、ここで : シェルにコマンドを起動するように要求します-F","(つまり、シェル が引数を使用してintoを-F,解釈し 、コマンド呼び出しの間、値に設定された変数を使用します。",",'NR==3..........YEARawk

に置き換えるだけです:

#!/bin/ksh
YEAR="$(awk -F',' 'NR==3{print $16}' sample.csv|sed -e 's/^[ \t]*//'|awk '{print substr($0,1,4)}')"

(私は試していませんが、あなたとあなたの sample.csv ファイルでうまくいくことを願っています)

(文字位置 1 に一致させるために「0」を使用することに注意してください。これは多くの awk 実装で機能しますが、すべてではありません (つまり、ほとんどの (ただしすべてではありません)) 0 を書き込むと 1 と見なされます))

于 2013-02-04T17:11:17.323 に答える