인쇄 전 awk 텍스트 처리

인쇄 전 awk 텍스트 처리

나는 스크립트 작성을 좋아하지 않지만 이 포럼의 도움으로 스크립트를 만들 수 있었습니다. 문제가 있지만 제대로 작동하지 않습니다(가능한지 확실하지 않음).

콘텐츠가 포함된 파일이 있습니다Y

lrwxrwxrwx  1  user1 gp  35  2021-09-07  2000  /folder/subfolder1/subfolder2/subfolder3/main/summary.txt
lrwxrwxrwx  1  user1 gp  35  2021-09-08  1400  /folder/subfolder1/subfolder2/main/summary.txt
lrwxrwxrwx  1  user1 gp  35  2021-09-09  1800  /folder/subfolder1/subfolder2/subfolder3/subfolder4/main/summary.txt

아래와 같이 3,6,7,8 열을 출력하고 "main" 앞의 폴더 이름과 연결하고 싶습니다.

user1 2021-09-07  2000  /folder/subfolder1/subfolder2/subfolder3/main/summary.txt subfolder3
user1 2021-09-08  1400  /folder/subfolder1/subfolder2/main/summary.txt subfolder2
user1 2021-09-09  1800  /folder/subfolder1/subfolder2/subfolder3/subfolder4/main/summary.txt subfolder4

다음을 어떻게 가질 수 있습니까?sed명령을 awk 명령의 {print} 변수 중 하나로 사용하시겠습니까?

awk '{print $3,$6,$7,$8}' fileY
sed 's/\// /g; s/\./ /g' fileY | awk '{for(i=8;i<=NF;i++){if($i~/^main/){a=i}} print $(a-1)}'

답변1

awk를 사용하면 sed가 필요하지 않습니다. 원하는 디렉토리가 항상 경로의 세 번째 디렉토리인 경우(예제에서와 같이) 필요한 것은 awk를 사용하는 것뿐입니다.

$ awk '{print $3, $6, $7, $8, p[split($8,p,"/")-2]}' file
user1 2021-09-07 2000 /folder/subfolder1/subfolder2/subfolder3/main/summary.txt subfolder3
user1 2021-09-08 1400 /folder/subfolder1/subfolder2/main/summary.txt subfolder2
user1 2021-09-09 1800 /folder/subfolder1/subfolder2/subfolder3/subfolder4/main/summary.txt subfolder4

그렇지 않으면 match()의 세 번째 인수를 사용하여 GNU awk를 사용하십시오.

$ awk '{match($8,"([^/]+)/main/",a); print $3, $6, $7, $8, a[1]}' file
user1 2021-09-07 2000 /folder/subfolder1/subfolder2/subfolder3/main/summary.txt subfolder3
user1 2021-09-08 1400 /folder/subfolder1/subfolder2/main/summary.txt subfolder2
user1 2021-09-09 1800 /folder/subfolder1/subfolder2/subfolder3/subfolder4/main/summary.txt subfolder4

또는 awk를 사용하십시오.

$ awk '{match($8,"[^/]+/main/"); print $3, $6, $7, $8, substr($8,RSTART,RLENGTH-6)}' file
user1 2021-09-07 2000 /folder/subfolder1/subfolder2/subfolder3/main/summary.txt subfolder3
user1 2021-09-08 1400 /folder/subfolder1/subfolder2/main/summary.txt subfolder2
user1 2021-09-09 1800 /folder/subfolder1/subfolder2/subfolder3/subfolder4/main/summary.txt subfolder4

답변2

나는 당신이 왜 거기를 원하는지 정말로 이해하지 못합니다 sed. 당신은 하나만으로 할 수 있습니다 awk. 물론 이는 폴더 이름에 공백이나 줄 바꿈이 없으며 공백을 필드 구분 기호로 안전하게 사용할 수 있다고 가정합니다. 이것이 사실이 아닌 경우 질문을 편집하고 보다 포괄적인 예를 추가하십시오.

$ awk '{ 
            split($8,dirs,"/");
            dir="" 
            for(i in dirs){ 
                if(dirs[i+1]=="main"){
                    dir=dirs[i]
                } 
            } 
            print $3,$6,$7,$8,dir}' fileY
user1 2021-09-07 2000 /folder/subfolder1/subfolder2/subfolder3/main/summary.txt subfolder3
user1 2021-09-08 1400 /folder/subfolder1/subfolder2/main/summary.txt subfolder2
user1 2021-09-09 1800 /folder/subfolder1/subfolder2/subfolder3/subfolder4/main/summary.txt subfolder4

여기서의 비결은 8번째 필드를 구분 기호 로 사용할 배열로 split()분할하는 것 입니다 . 그런 다음 다음 배열 항목이 인 마지막 배열 항목을 반복 하고 유지합니다 . 이는 여러 번 발생하는 경우 마지막 항목만 일치한다는 의미입니다.dirs/dirsmainmain

답변3

또 다른 접근 방식은 폴더 이름 구조가 주어진 예( ) 와 일치한다고 가정하고 rev필수 폴더가 구분 기호로 역으로 사용되는 세 번째 항목이라는 사실을 활용하여 를 사용하는 것입니다 ./<wanted folder>/main/summary.txt

$ rev file | awk -F'/' '{ print $3,$0 }' | rev | awk '{ print $3,$6,$7,$8,$9 }'
user1 2021-09-07 2000 /folder/subfolder1/subfolder2/subfolder3/main/summary.txt subfolder3
user1 2021-09-08 1400 /folder/subfolder1/subfolder2/main/summary.txt subfolder2
user1 2021-09-09 1800 /folder/subfolder1/subfolder2/subfolder3/subfolder4/main/summary.txt subfolder4

답변4

sedGNU 중첩 그룹화 사용

$ sed -E 's|.*\s[0-9]\s\s(.[^ ]*).*([0-9]{4}-.*/(.[^/]*).*/.*/.*)|\1 \2 \3|' input_file
user1 2021-09-07  2000  /folder/subfolder1/subfolder2/subfolder3/main/summary.txt subfolder3
user1 2021-09-08  1400  /folder/subfolder1/subfolder2/main/summary.txt subfolder2
user1 2021-09-09  1800  /folder/subfolder1/subfolder2/subfolder3/subfolder4/main/summary.txt subfolder4

관련 정보