나는 스크립트 작성을 좋아하지 않지만 이 포럼의 도움으로 스크립트를 만들 수 있었습니다. 문제가 있지만 제대로 작동하지 않습니다(가능한지 확실하지 않음).
콘텐츠가 포함된 파일이 있습니다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
/
dirs
main
main
답변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
sed
GNU 중첩 그룹화 사용
$ 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