sed 문 결합

sed 문 결합

내 입력 파일이 다음과 같다고 가정해 보겠습니다.

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장소반환하고, 줄의 첫 번째 공백을 줄바꿈으로 바꾸고, 뒤의 공백을 모두 지우고...

  • 줄의 남은 각 공백 앞에 쉼표를 추가하면 완료됩니다.

관련 정보