タプルから欠落しているファイルを印刷する

タプルから欠落しているファイルを印刷する

次の形式の大きなファイルタプルのリストがあります。

A_1.txt
A_2.txt 
B_1.txt 
B_2.txt 
C_1.txt  <<
D_1.txt
D_2.txt
E_1.txt
E_2.txt

ディレクトリに。ご覧のとおり、C_2.txt私のリストにはありません。これらのファイルのうち、「パートナー」が見つからないファイルを見つけて、それをbash修正するための賢い方法を見つける必要があります。

x=$(pwd)
find $x -type f -printf '%f\n' | sort | uniq -c

リストの最初の1文字のみを検索し、その最初の文字で始まるファイル数を印刷するように{0:1}を含めます。

予想出力:

2  A
2  B
1  C
2  D
2  E

または(理想的な)期待される出力は次のとおりです。

C_1.txt

答え1

ファイル名を繰り返し、プレフィックス(最初の文字列の前の文字列_)を抽出し、そのプレフィックスで始まるファイル数を確認します(私はそれを使用しましたが、set配列を使用して長さを確認することもできます)。
1つしかない場合は、名前を印刷してください。

for f in ./*.txt; do
n=${f%%_*}
set -- "${n}"_*
[ $# -eq 1 ] && printf '%s\n' "${f}"
done
set --

答え2

ファイルのリストを次にパイプします。

sed -n '$!N;/\(.*\)1.txt\n\12.txt/!{P;D;}'

これは常に一対の行を読み込み、一対でない場合は孤立した行をsomething1.txt印刷するので、「理想的な予想出力」を提供します。something2.txt

上海:

  • N次の行をパターンスペースに追加して、間に改行文字を含む2行を持ちます。
  • /\(.*\)1.txt\n\12.txt/次のコマンドを実行するかどうかを選択する「アドレス」です。これは、行番号、範囲、またはこの場合パターン空間と一致する必要がある正規表現です。.*すべての文字列と一致することができ、それをで囲むことで後で\(.*\)逆参照できます\1。したがって、\n\12改行文字を意味し、その後に最初から始まる文字列が続き、最後に2anystring1.txtanystring2.txt
  • アドレスの後ろは!一致を反転するため、パターン空間が式と一致しない場合にのみ、次のことが行われます。これは、線がペアに属していない場合に発生します。
  • コマンドブロックを形成します{}。つまり、その中のすべてのコマンドは、パターンが一致する場合にのみ実行されます。
  • P最初の改行文字までパターンスペースを印刷し、最初の行のみを印刷します(2行目がペアに属しているかどうかわからないため)。
  • 最後に、D最初の改行の前のパターン空間を削除し、残りの行で次のループを開始して、次の行とペアを再試行します。

この説明があなたの理解に少しでも役立つことを願っていますsed。 *

関連情報