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

相关内容