Bash에서 구분 기호를 사용하여 한 줄로 줄을 인쇄하는 방법은 무엇입니까?

Bash에서 구분 기호를 사용하여 한 줄로 줄을 인쇄하는 방법은 무엇입니까?

3개 분야에서 데이터를 수집했습니다. 세 번째 필드 데이터를 한 줄로 인쇄하고 싶습니다. 제가 얻은 데이터입니다.

$ cat file
1234  1234  dei_1/3,dei_2/3,dei_9/0,
dei_10/0,dei_8/4
2345  2345  dei_8/9,dei_5/6,dei_4/9
4244  4244  dei_0/9,dei_4/6,dei_4/1
4235  4235  dei_0/9,dei_4/6,dei_4/,de
i_9/7,dei_1/3,dei_2/3,dei_9/0

예상되는 결과:

1234  1234  dei_1/3,dei_2/3,dei_9/0,dei_10/0,dei_8/4
2345  2345  dei_8/9,dei_5/6,dei_4/9
4244  4244  dei_0/9,dei_4/6,dei_4/1
4235  4235  dei_0/9,dei_4/6,dei_4/,dei_9/7,dei_1/3,dei_2/3,dei_9/0

지금까지 내가 가지고 있는 코드

while read file; do if [[ $file == 1 ]]; then echo -n; fi; done 

답변1

다음 스크립트는 2개의 숫자로 시작하지 않는 모든 줄을 이전 줄과 연결합니다.

$ awk -v ORS="" '$1~/^[0-9]+$/ && $2~/^[0-9]+$/ && NR>1{printf "\n"}1' file
1234  1234  dei_1/3,dei_2/3,dei_9/0,dei_10/0,dei_8/4
2345  2345  dei_8/9,dei_5/6,dei_4/9
4244  4244  dei_0/9,dei_4/6,dei_4/1
4235  4235  dei_0/9,dei_4/6,dei_4/,dei_9/7,dei_1/3,dei_2/3,dei_9/0

ORS이는 빈 문자열로 재설정되는 (출력 레코드 구분 기호) 에 의존합니다 . 처음 2개의 필드가 숫자인 경우(첫 번째 줄이 아님) 줄 바꿈이 추가됩니다.

답변2

짧은sed방법:

sed -E 'N; s/\n([^[:space:]]*,[^[:space:]]+)/\1/' file

산출:

1234  1234  dei_1/3,dei_2/3,dei_9/0,dei_10/0,dei_8/4
2345  2345  dei_8/9,dei_5/6,dei_4/9
4244  4244  dei_0/9,dei_4/6,dei_4/1
4235  4235  dei_0/9,dei_4/6,dei_4/,dei_9/7,dei_1/3,dei_2/3,dei_9/0

답변3

몇 가지 awk 메소드:

숫자로 시작하는 최신 행을 저장하고, 숫자로 시작하지 않는 경우 현재 행에 추가합니다.

awk '
    /^[[:digit:]]/ {if (prev) print prev; prev=$0; next} 
    {prev = prev $0} 
    END {if (prev) print prev}
' file

파일을 반전시킵니다. 줄이 숫자가 아닌 값으로 시작하면 다음 줄을 읽고 이전 줄이 추가됩니다. 결과를 반전시킵니다. 레코드가 최대 1번 분할된다고 가정합니다.

tac file | awk '/^[^[:digit:]]/ {this = $0; getline; $0 = $0 this} 1' | tac

관련 정보