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