生成され変数に追加される文字列のリストが2つあります。$t
次に$nnpp
、commコマンドを使用して比較します。
pcr=$(comm -13 <(echo “$t” | sort) <(echo “$nnpp” | sort))
その後、差分をベースファイルに追加して並べ替えます。
psl=$(sort <(echo $t) <(echo $pcr) | uniq)
今、私が作成した新しいリストを繰り返そうとすると、リストは$psl
1つとして扱われ、最初の繰り返しからすべてを取得します。繰り返すためにどのように分離できますか?
私は成功せずにこれを試しました。
for e in “${psl[@]}”
then
echo $e
done
気になる方のためにスクリプトの始めにもこの内容があります。
IFS=$’\n’
IFS=$’\t’
答え1
あなたが経験している問題のいくつかは、行に引用符がないことで内容が$t
1行になり、多くの単語を含む2つの長い行に$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
pipingと同じで、ソートされた出力を書き込むファイル名を指定するフラグを渡すuniq
ことができます。sort
-o