다음 형식의 텍스트 파일이 있습니다.
dir1/sub-dir1/.../filename1 author date
dir1/sub-dir1/.../filename2 author date
.
.
.
dir2/sub-di2/.../filename1 author date
dir2/sub-dir2/.../filename2 author date
추가 세부 사항:
- 나열된 각 파일 이름은 정확히 1~2번 발생합니다. 즉,
filename_n
정확히 1~2번 존재합니다. 한 번 존재하는 경우 경로에 따라 v1 또는 v2의 한 가지 소프트웨어 버전에만 존재합니다. 2번 존재하면 파일은 v1과 v2 모두입니다. - 경로에 따라 파일이 v1인지 v2인지가 결정됩니다.
- 텍스트 파일은 탭으로 구분됩니다.
- 하위 디렉터리 수는 파일마다(따라서
...
코드 블록 내에서) 다릅니다. - (저작자와 날짜는 이 에서 가져오지 않습니다
ls
. 이 파일의 변경 사항을 기록한 마지막 git 커밋을 요청하여 별도로 생성됩니다.)
sed와 regex를 사용하여 파일을 다음과 같이 변환해 보았습니다.
dir1/sub-dir1/.../filename1 author date dir2/sub-di2/.../filename1 author date
dir1/sub-dir1/.../filename2 author date dir2/sub-dir2/.../filename2 author date
.
.
.
일치하는 항목이 없으면 filename-n
두 번이 아닌 한 번만 나타나야 합니다.
sed와 정규식을 사용하여 변환을 수행하는 방법을 찾고 있습니다. 동일한 파일( 사용 -i
)에 쓰거나 별도의 파일에 쓸 수 있습니다.
답변1
다음을 사용하여 이 작업을 수행하는 것이 전적으로 가능합니다 sed
.sed
sort
파일 이름은 세 번째 하위 디렉터리에 있으며 네 번째 필드( -k 4
)와 \
(도대체 왜!!)를 필드 구분자로 사용하라는 지시를 받습니다 .
sort -t'\' -k 4 /tmp/p|sed 'N;/\(\\[^\]* \).*\1/s/\n/ /;P;D'
이 sed
명령은 일반적인 N;P;D
루프를 사용하여 항상 한 번에 두 줄을 처리하고 \
파일 이름(TAB 사이)이 중복되는지 확인합니다.
스크립트에는 두 개의 텍스트 탭이 있습니다 sed
. GNU를 사용하면 다음과 같이 작성할 sed
수 있습니다 \t
.
sort -t'\' -k 4 /tmp/p|sed 'N;/\(\\[^\]*\t\).*\1/s/\n/\t/;P;D'
또한 탭이나 백슬래시가 포함된 경로는 스크립트를 손상시킬 수 있습니다.
답변2
경로에 포함된 문자(개행 제외)에 관계없이 모든 Unix 시스템의 모든 쉘에서 awk를 사용하십시오.
$ cat tst.awk
BEGIN { FS=OFS="\t" }
{
file = $0
sub(".*/","",file)
paths[file] = (file in paths ? paths[file] OFS : "") $0
}
END {
for ( file in paths ) {
print paths[file]
}
}
$ awk -f tst.awk file
dir1/sub-dir1/.../filename2 author date dir2/sub-dir2/.../filename2 author date
. . .
dir1/sub-dir1/.../filename1 author date dir2/sub-di2/.../filename1 author date
출력 순서가 중요하다면 이것은 사소한 조정입니다. 출력 순서가 무엇인지 알려주십시오(예: 먼저 읽기, 파일 이름 알파벳순, 디렉토리 알파벳순, 기타).