내 입력 파일이 다음과 같다고 가정해 보겠습니다.
ID1
1 5
6 8
ID2
1 4
5 7
나는 이러한 작업을 결합할 수 있는 루프를 공식화하려고 합니다.
줄이 문자로 시작하는 경우: 필드 뒤에 '\n'을 유지합니다.
줄이 숫자로 시작하는 경우:
sed 's / \ t /, / g; s / \ n /, / g '
다음 줄이sed 's / \ t /, / g'
문자( )로 시작 하지 않는 한 각 '\t' 및 '\n'을 쉼표( )로 바꿉니다.
예상 출력:
ID1
1, 5, 6, 8
ID2
1, 4, 5, 7
답변1
sed '/^[0-9]/{:a;s/[\t\n ]\+/,/g;N;/\n[A-Z]/!ba;}'
이루어질 일들.
설명하다:
/^[0-9]/
숫자로 시작하는 줄만 일치시키고 해당 줄에 명령 그룹을 적용합니다.
{}
요청된 명령 그룹
{:a;s/[\t\n ]\+/,/g;N;/\n[A-Z]/!ba;}
각 줄을 반복하고 문자로 시작하는 줄이 나올 때까지 모든 공백, 탭 및 줄 바꿈을 쉼표로 바꿉니다.
답변2
다음과 같이 이를 달성할 수 있어야 합니다. 현재 줄이 숫자로 시작하는 경우 다음 줄을 패턴 공간에 추가한 다음 공백, 탭 및 개행 시퀀스를 쉼표 공백으로 바꿉니다.
$ sed '/^[0-9]/{N;s/[ \t\n]\+/, /g}' file
ID1
1, 5, 6, 8
ID2
1, 4, 5, 7
답변3
awk
나는 더 많은 제어권을 제공하고 문제를 요약하는 를 선택하겠습니다 .
awk 'BEGIN{FS="\t"; OFS=","}
/^[^A-Z]/ {for (i=1; i<=NF; i++) {if (!a) a=$i; else a=a OFS $i} next}
{if (a) print a; a=""; print}
END{print a}'
설명하다
BEGIN{FS="\t"; OFS=","}
입력 필드 구분 기호를 탭으로 설정하고 출력 필드 구분 기호를 쉼표로 설정합니다./^[^A-Z]/ {for (i=1; i<=NF; i++) {if (!a) a=$i; else a=a OFS $i} next}
대문자로 시작하지 않는 줄에서는 값을 변수에 저장합니다a
.{if (a) print a; a=""; print}
나머지 경우(예: 대문자로 시작하는 줄)에는 저장된 값이 현재 줄과 함께 인쇄됩니다.END{print a}
전체 파일을 처리한 후 마지막 블록의 값을 사용하여 마지막으로 저장된 변수를 인쇄합니다.
출력을 봅니다.
$ awk 'BEGIN{FS="\t"; OFS=","}/^[^A-Z]/ {for (i=1; i<=NF; i++) {if (!a) a=$i; else a=a OFS $i} next} {if (a) print a; a=""; print} END{print a}' file
ID1
1,5,6,8
ID2
1,4,5,7
sed에서는 언제든지 -e
옵션을 사용하여 명령을 결합할 수 있다는 점을 기억하세요.
답변4
tr -s '\t\nI' ' \n' <<\DATA |\
sed 's/^/I/;s/ */\n/;s/ *[0-9]/,&/g'
ID1
1 5
6 8
ID2
1 4
5 7
DATA
산출
ID1
1, 5, 6, 8
ID2
1, 4, 5, 7
먼저
tr
모든 탭과 줄 바꿈을 공백으로 변환하십시오.그리고모든 대문자가 래핑됩니다. 또한 담당자를 압박합니다. 이 시점에서는sed
다음과 같은 입력이 전달되므로 작업이 매우 간단해집니다 .^D [num] [num] [num] [num] [num] ... [num] $
다음
sed
장소나반환하고, 줄의 첫 번째 공백을 줄바꿈으로 바꾸고, 뒤의 공백을 모두 지우고...줄의 남은 각 공백 앞에 쉼표를 추가하면 완료됩니다.