튜플에서 누락된 파일 인쇄

튜플에서 누락된 파일 인쇄

다음 형식의 큰 파일 튜플 목록이 있습니다.

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배열을 사용하여 길이를 확인할 수도 있습니다).
하나만 있는 경우 이름을 인쇄하세요.

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다음 줄을 패턴 공간에 추가하여 사이에 개행 문자를 포함하여 두 줄을 갖게 됩니다.
  • /\(.*\)1.txt\n\12.txt/다음 명령을 실행할지 여부를 선택하는 "주소"입니다. 이는 줄 번호, 범위 또는 이 경우 패턴 공간과 일치해야 하는 정규 표현식일 수 있습니다. .*모든 문자열과 일치할 수 있으며, 이를 로 둘러싸면 \(.*\)나중에 로 역참조할 수 있습니다 \1. 따라서 \n\12개행 문자를 의미하고 그 뒤에 처음부터 시작하는 문자열이 이어지며 마지막으로 2.anystring1.txtanystring2.txt
  • 주소 뒤에 오는 것은 !일치를 반전시키므로 패턴 공간이 표현식과 일치하지 않는 경우에만 다음이 수행됩니다. 이는 선이 쌍에 속하지 않는 경우 발생합니다.
  • 명령 블록을 형성합니다 {}. 즉, 그 안에 있는 모든 명령은 패턴이 일치하는 경우에만 실행됩니다.
  • P첫 번째 개행 문자까지 패턴 공간을 인쇄하여 첫 번째 줄만 인쇄합니다(두 번째 줄이 쌍에 속하는지 모르기 때문에).
  • 마지막으로 D첫 번째 줄 바꿈 앞의 패턴 공간을 제거하고 나머지 줄에서 다음 루프를 시작하여 다시 다음 줄과 쌍을 이루려고 시도합니다.

이 설명이 여러분의 이해에 조금이나마 도움이 되기를 바랍니다 sed. *

관련 정보