Linux シェル: ファイルからパイプで区切られた値を抽出する

Linux シェル: ファイルからパイプで区切られた値を抽出する

ファイルには次の値があります:

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

関連情報