読む

読む

スペースで区切られた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

関連情報