sed의 정규식 검색을 사용하여 파일의 항목 정렬

sed의 정규식 검색을 사용하여 파일의 항목 정렬

다음 형식의 텍스트 파일이 있습니다.

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

출력 순서가 중요하다면 이것은 사소한 조정입니다. 출력 순서가 무엇인지 알려주십시오(예: 먼저 읽기, 파일 이름 알파벳순, 디렉토리 알파벳순, 기타).

관련 정보