![두 줄을 하나로 병합하고 Unix에서 끝 패턴 ABC를 사용하여 올바른 줄을 사용하지 않으려고 함 [닫기]](https://linux55.com/image/199964/%EB%91%90%20%EC%A4%84%EC%9D%84%20%ED%95%98%EB%82%98%EB%A1%9C%20%EB%B3%91%ED%95%A9%ED%95%98%EA%B3%A0%20Unix%EC%97%90%EC%84%9C%20%EB%81%9D%20%ED%8C%A8%ED%84%B4%20ABC%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EC%98%AC%EB%B0%94%EB%A5%B8%20%EC%A4%84%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%A7%80%20%EC%95%8A%EC%9C%BC%EB%A0%A4%EA%B3%A0%20%ED%95%A8%20%5B%EB%8B%AB%EA%B8%B0%5D.png)
다음 파일이 있습니다.
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을 사용하여 이 솔루션을 찾았습니다 .sed
awk
$ 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