다음 파일이 있습니다.
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