次の形式の大きなファイルタプルのリストがあります。
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
改行文字を意味し、その後に最初から始まる文字列が続き、最後に2
。anystring1.txt
anystring2.txt
- アドレスの後ろは
!
一致を反転するため、パターン空間が式と一致しない場合にのみ、次のことが行われます。これは、線がペアに属していない場合に発生します。 - コマンドブロックを形成します
{}
。つまり、その中のすべてのコマンドは、パターンが一致する場合にのみ実行されます。 P
最初の改行文字までパターンスペースを印刷し、最初の行のみを印刷します(2行目がペアに属しているかどうかわからないため)。- 最後に、
D
最初の改行の前のパターン空間を削除し、残りの行で次のループを開始して、次の行とペアを再試行します。
この説明があなたの理解に少しでも役立つことを願っていますsed
。 *