スペースで区切られた2つの文字列で1行を区切る必要があります(例:)key value
。
私は試した:
key=$(awk -FS=" " {print $1} line)
value=$(awk -FS=" " {print $2} line)
しかし、私は次のようになります。
awk:ライン2:行方不明}ファイルの末尾付近
どんなアイデアがありますか?
答え1
awk
コマンドラインのスクリプトは一重引用符で囲む必要があります。
awk -F ' ' '{ print $1 }' filename
周囲の一重引用符に注意してください{ ... }
。これを設定する正しい方法は、ブロックを介して、FS
パススルー-F
、-v FS=...
またはBEGIN
ブロック内で設定することですが、withでは設定しません-FS=...
。
作成したコマンドもline
ファイル名とみなします。
$line
スペースが1つだけの文字列の場合は、2つの文字列に分割できます。
first_part=${line% *} # removes the space and everything after it
second_part=${line#* } # removes the space and everything before it
同様に、if は$line
以下を含む文字列です。=
first_part=${line%=*} # removes the = and everything after it
second_part=${line#*=} # removes the = and everything before it
答え2
配列を使用してスペースの行を分割することもできます。
もしワイヤーはstring
arr=($line)
key="${arr[0]}"
value="${arr[1]}"
注:- $lineの最初の単語が*の場合、arr配列には現在のディレクトリのすべてのファイル名が含まれます。したがって、安全を保ち、このような状況を回避するには、次のようにします。
set -f; arr=($line); set +f key="${arr[0]}" value="${arr[1]}"
もしワイヤーはいfile
while read -r words
do
set -- $words
key=$1
value=$2
done < line
答え3
読む
ただ使用してくださいread
:
read key value
行の最初のスペースの前のすべての内容はに入り、key
それ以降のすべてのコンテンツ(他のスペースを含む)はに入りますvalue
。
答え4
外部プログラムを呼び出す代わりに、シェルの引数拡張機能を使用できます。
key=${line%% *} # from the end remove the longest string matching
# a space followed by any characters
value=${line#* } # from the start remove the shortest string matching
# any characters followed by a space