패턴을 찾을 때까지 여러 줄을 하나로 연결합니다.

패턴을 찾을 때까지 여러 줄을 하나로 연결합니다.

AWK 및 SED 모드를 사용하면 다음과 유사한 파일이 생성됩니다.

|
9000
3000
1000
0000
0000
2000
1000
2000
|
5669000
518000
3000
16000
0000
28000
2241000
2841000
|
9020000
453000
520000
4000
2852000
5191000
75000
|

"|"로 구분된 줄을 쉼표로 구분된 한 줄로 합칠 수 있나요?

9000,3000,1000,0000,0000,2000,1000,2000
5669000,518000,3000,16000,0000,28000,2241000,2841000
9020000,453000,520000,4000,2852000,5191000,75000

이 작업을 수행하기 위해 붙여넣기를 사용했지만 "|" 사이의 줄 수가 동일하지 않기 때문에 원치 않는 결과가 발생합니다.

답변1

awk해결책. 의심이 조금 길어졌습니다.

$ awk 'BEGIN{RS="|"}NF>1{print substr(gensub(/\n/,",","g"),2,length($0)-2)}' file
9000,3000,1000,0000,0000,2000,1000,2000
5669000,518000,3000,16000,0000,28000,2241000,2841000
9020000,453000,520000,4000,2852000,5191000,75000
$

온라인으로 사용해 보세요!

답변2

이것은 잘 작동하는 것 같습니다:

$ tr "|\n" "\n," < input | sed 's/^,//;s/,$//'
9000,3000,1000,0000,0000,2000,1000,2000
5669000,518000,3000,16000,0000,28000,2241000,2841000
9020000,453000,520000,4000,2852000,5191000,75000

우리는 이를 s를 newline으로, newline을 s로 변환하는 tr데 사용합니다 . 그런 다음 결과 출력을 가져와 선행 또는 후행 s 로 제거합니다 .|,,sed

답변3

sed ':L; ${s/\n/,/g; s/,|,/\n/g; s/|,\|,|//g};  N; bL;' file

답변4

awk -vRS='|' -vOFS=, '$1=$1""' infile
  • , RS='|'awk의 기본값을 변경하십시오오른쪽에코코드에스eerator는 \n이를 파이프로 변경합니다 |.
  • , OFS=,awk의 기본값을 변경하십시오산소산출에프생산하다에스eerator는 쉼표를 공백으로 바꿉니다 ,.

  • ( $1==$1모든 필드를 사용할 수 있음)은 재평가를 발생시키고 $0(전체 행은 awk로 알려져 있음) |RS as 및 OFS as 를 기반으로 필드를 조인 합니다 ,.

  • 큰따옴표는 '$1=$1""'awk가 문자열 할당을 수행하도록 강제하는 데 사용되므로 0만 있는 줄은 삭제되지 않습니다.

  • 출력은 다음과 같습니다

    9000,3000,1000,0000,0000,2000,1000,2000
    5669000,518000,3000,16000,0000,28000,2241000,2841000
    9020000,453000,520000,4000,2852000,5191000,75000
    

관련 정보