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