다음 형식의 큰 파일 튜플 목록이 있습니다.
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.txt
anystring2.txt
- 주소 뒤에 오는 것은
!
일치를 반전시키므로 패턴 공간이 표현식과 일치하지 않는 경우에만 다음이 수행됩니다. 이는 선이 쌍에 속하지 않는 경우 발생합니다. - 명령 블록을 형성합니다
{}
. 즉, 그 안에 있는 모든 명령은 패턴이 일치하는 경우에만 실행됩니다. P
첫 번째 개행 문자까지 패턴 공간을 인쇄하여 첫 번째 줄만 인쇄합니다(두 번째 줄이 쌍에 속하는지 모르기 때문에).- 마지막으로
D
첫 번째 줄 바꿈 앞의 패턴 공간을 제거하고 나머지 줄에서 다음 루프를 시작하여 다시 다음 줄과 쌍을 이루려고 시도합니다.
이 설명이 여러분의 이해에 조금이나마 도움이 되기를 바랍니다 sed
. *