Linux Shell:從檔案中提取由管道分隔的值

Linux Shell:從檔案中提取由管道分隔的值

我在文件中有以下值:

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”取得檔案的第二行,然後“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

列印從第二行開始的第二個字段的字段,每行輸出一個字。

以下sed命令會執行相同的操作:

sed '1d;2y/|/\n/;s/[^\n]*\n//' file

它透過從輸入中刪除第一行,然後將所有管道更改為換行符,並刪除直到(並包括)第一個換行符來實現此目的。

管道

tail -n 1 file | cut -d '|' -f 2- | tr '|' '\n'

tail透過使用 選取最後一行,從第二行開始提取字段,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

相關內容