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

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

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

line 1: 31915
line 2: Salchipapa|papa|salchicha|aceite|queso

papa、salchicha、oli、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行に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

関連情報