これを行う方法は次のsedとおりです。
sed ':a;${s/\n//g;s/^/sed \o47/;s/$/d\o47 documents.txt/;b};s/$/d\;/;N;ba' lines.txt | sh
sedコマンドを作成し、sedそれを実行するシェルにパイプするために使用します。結果のsedコマンドは、単に `sed '3d; 5d;11d'documents.txtのようになります。
それを構築するために、外部sedコマンドはd;各番号の後にアフターを追加し、次の行にループして、先頭に分岐します(N; ba)。最後の行()に達する$と、すべての改行が削除され、sed '先頭に追加され、最後dの行' documents.txtが追加されます。次に、ラベルが指定されていないため、 -ループから最後までb分岐します。:aba
joinおよびを使用してこれを行う方法は次のcat -nとおりです(lines.txtがソートされていると仮定します)。
join -t $'\v' -v 2 -o 2.2 lines.txt <(cat -n documents.txt | sed 's/^ *//;s/\t/\v/')
lines.txtが並べ替えられていない場合:
join -t $'\v' -v 2 -o 2.2 <(sort lines.txt) <(cat -n documents.txt | sed '^s/ *//;s/\t/\v/')
編集:
join元のバージョンがdocuments.txtの各行の最初の単語のみを出力するコマンドのバグを修正しました。