
我在文件中有以下值:
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