我有 2 个生成并放入变量的字符串列表,$t
以及$nnpp
.然后使用comm命令来比较它们。
pcr=$(comm -13 <(echo “$t” | sort) <(echo “$nnpp” | sort))
然后将差异添加回主文件中并对其进行排序。
psl=$(sort <(echo $t) <(echo $pcr) | uniq)
现在,当我尝试循环遍历我制作的新列表时$psl
,它被视为一件事,并在第一次迭代时获取所有内容。我怎样才能把它分开以便我可以循环它?
我已经尝试过这个但没有成功。
for e in “${psl[@]}”
then
echo $e
done
如果您想知道的话,我在脚本的开头也有这个。
IFS=$’\n’
IFS=$’\t’
答案1
您遇到的部分问题是该行中缺少引号,这使得$t
和的内容$pcr
成为一行,这使得psl
只有两行长行,其中包含许多单词。
psl=$(sort <(echo $t) <(echo $pcr) | uniq)
一个简单的第一个修复是:
psl=$(sort <(echo "$t") <(echo "$pcr") | uniq)
但随后您将需要$psl
逐行迭代(我假设您正在逐行处理它,因为您使用的是sort
,uniq
和等工具comm
。)
while read -r e ; do
echo "$e"
done <<<"$psl"
如果您使用临时文件,这实际上会变得容易得多:
echo "$t" | sort >t.sorted
echo "$nnpp" | sort >nnpp.sorted
comm -13 t.sorted nnpp.sorted >pcr
sort t.sorted pcr | uniq >psl
while read -r e ; do
echo "$e"
done <psl
顺便说一句,因为pcr
简单地具有唯一的行nnpp
,并且您正在使用uniq
它应该消除 和 之间的重复项t
,nnpp
也许您可以使用更简单的方法:
echo "$t" >t
echo "$nnpp" >nnpp
sort -u -o psl t nnpp
请注意,sort
的-u
标志与通过管道传输相同uniq
,并且您可以传递sort
一个-o
标志来命名要在其中写入排序输出的文件。