두 줄을 하나로 병합하고 Unix에서 끝 패턴 ABC를 사용하여 올바른 줄을 사용하지 않으려고 함 [닫기]

두 줄을 하나로 병합하고 Unix에서 끝 패턴 ABC를 사용하여 올바른 줄을 사용하지 않으려고 함 [닫기]

다음 파일이 있습니다.

07-10-2021-ABC-hello-203455
07-10-2021-Aer-hello-2034
55
07-10-2021-Aad-hello-20345
5
07-10-2021-dafC-hello-203
455

내가 원하는 출력은 다음과 같습니다.

07-10-2021-ABC-hello-203455
07-10-2021-aer-hello-203455
07-10-2021-Aad-hello-203455
07-10-2021-dafc-hello-203455

확인하는 것을 도와주실 수 있나요? 사용해 보았지만 sed성공하지 못했습니다. 올바른 줄을 건너뛰고 싶고 unix에서 잘못된 2줄을 병합해야 합니다.

답변1

plus 1을 사용하여 이 솔루션을 찾았습니다 .sedawk

$ sed 's/^\([0-9]*\)$/#\1/' file | awk -v RS= '{ gsub(/\n#/, "", $0); print }'
07-10-2021-ABC-hello-203455
07-10-2021-Aer-hello-203455
07-10-2021-Aad-hello-203455
07-10-2021-dafC-hello-203455

1 나는 그것만 확신한다sed 또는 awk, 하지만 지금까지 제대로 작동하지 못했습니다.

답변2

다중 문자 RS 및 RT에 GNU awk 사용:

$ awk -v RS='[0-9]{2}(-[^-]*){5}\n' '
    { print gensub(/\n/,"","g",RT) }
' file
07-10-2021-ABC-hello-203455
07-10-2021-Aer-hello-203455
07-10-2021-Aad-hello-203455
07-10-2021-dafC-hello-203455

그렇지 않으면 awk를 사용하십시오.

$ awk '
    /^([0-9]{2}-){2}[0-9]{4}-/ {
        printf "%s%s", prev, $0
        prev = ORS
        next
    }
    { prev = $0 ORS }
    END {
        printf "%s", prev
    }
' file
07-10-2021-ABC-hello-203455
07-10-2021-Aer-hello-203455
07-10-2021-Aad-hello-203455
07-10-2021-dafC-hello-203455

답변3

이것은 awk를 사용하는 한 가지 방법입니다. 이는 "올바른" 행이 문자열을 포함하는 행이라고 가정합니다 hello. 기준이 다른 경우 정규식을 다음과 같은 다른 것으로 변경하거나 필요한 /hello/것으로 변경하십시오./-/length($0) > 10

$ awk '/hello/&&prev{print prev}/hello/{prev=$0;next}{prev=prev $0}END{if(prev)print prev}' file
07-10-2021-ABC-hello-203455
07-10-2021-Aer-hello-203455
07-10-2021-Aad-hello-203455
07-10-2021-dafC-hello-203455

더 읽기 쉬운 형식으로:

awk '
  /hello/ && prev {print prev}
  /hello/ {prev = $0; next}
  {prev = prev $0}
  END {if (prev) print prev}
' file

더 많은 손상된 파일을 사용한 또 다른 테스트:

$ cat file2
07-10-2021-ABC-hello-203455
07-10-2021-ABC-hello-203455
07-10-2021-ABC-hello-203455
07-10-2021-Aer-hello-2034
55
111
07-10-2021-Aad-hello-20345
07-10-2021-Aad-hello-20345
07-10-2021-Aad-hello-20345
5
07-10-2021-dafC-hello-203
455
07-10-2021-dafC-hello-203

$ awk '
  /hello/ && prev {print prev}
  /hello/ {prev = $0; next}
  {prev = prev $0}
  END {if (prev) print prev}' file2
07-10-2021-ABC-hello-203455
07-10-2021-ABC-hello-203455
07-10-2021-ABC-hello-203455
07-10-2021-Aer-hello-203455111
07-10-2021-Aad-hello-20345
07-10-2021-Aad-hello-20345
07-10-2021-Aad-hello-203455
07-10-2021-dafC-hello-203455
07-10-2021-dafC-hello-203

답변4

첫째, 모든 올바른 줄에 "hello"가 있으면 다음 명령을 사용하여 이 출력을 생성할 수 있습니다.

cat YourFile | grep hello

잘못된 행을 나열하고 이를 1개의 행으로 병합하려면 이를 사용하여 ","로 구분되어 있음을 표시합니다.

cat YourFile | grep -v hello | paste -s -d, - 

이 명령 이후의 출력은 다음과 같습니다.

55,5,455

관련 정보