
ファイルには次の値があります:
line 1: 31915
line 2: Salchipapa|papa|salchicha|aceite|queso
papa、salchicha、aceite、quesoの値を取得する必要があります
つまり、行 2、列 2 から値を取得する必要があるということです。
答え1
変更することで、すべてを配列に読み込みIFS
、将来使用するために保存することができます。
OIFS=$IFS; IFS='|'; array=($(sed '2q;d' "$filename")); IFS=$OIFS
echo ${array[0]}
Salchipapa
echo ${array[1]}
papa
こうすることで、任意の 10 個の値に制限されることがなくなり、配列内の要素数がわかっているため、後で「null」をテストする必要もなくなります。
echo ${#array[@]}
5
だからあなたはただ....
for (( i=0; i<${#array[@]}; i++ )); do echo ${array[$i]}; done
Salchipapa
papa
salchicha
aceite
queso
答え2
私は次のようにして実行し、うまくいきました:
for i in {2..10}
do
ingName=$(sed -n 2p $filename | cut -d '|' -f $i)
done
「sed -n 2p $filename」はファイルの 2 行目を取得し、「cut -d '|' -f $i」はパイプで区切られた各成分を取得します。数字の 10 は、最大 10 個の成分があることを示しているため、コードの後半で、変数 ingName が null でない場合にのみ機能することを検証します。
答え3
実際のファイルの内容が
31915
Salchipapa|papa|salchicha|aceite|queso
そうすれば
awk -F '|' 'FNR == 2 { for (i=2; i<=NF; ++i) print $i }' file
2 行目以降の 2 番目のフィールドを、出力の行ごとに 1 語ずつ印刷します。
次のsed
コマンドでも同じことが起こります:
sed '1d;2y/|/\n/;s/[^\n]*\n//' file
これは、入力から最初の行を削除し、すべてのパイプを改行に変更し、最初の改行まで(改行を含む)削除することによって行われます。
パイプライン
tail -n 1 file | cut -d '|' -f 2- | tr '|' '\n'
は、最後の行を で選択しtail
、2 行目以降のフィールドを で抽出しcut
、すべてのパイプを改行に変更することで、サンプル データと同じ出力を生成します。
上記のバリエーション:
tail -n 1 file | tr '|' '\n' | tail -n +2
答え4
以下のコマンドを試してみたところ、問題なく動作しました
awk 'NR==2{print $NF}' filename| awk -F "|" '{$1="";print $0}' |sed -r "s/^\s+//g"| perl -pne "s/ /\n/g"
出力
papa
salchicha
aceite
queso