행에 문자가 있으면 행을 열로 분할합니다.

행에 문자가 있으면 행을 열로 분할합니다.

New Data파일에서 문구가 발견될 때마다 새 줄을 시작하여 줄을 열로 나누고 싶습니다 .

입력하다

New Data
52.6114082616
41.8319773432
75.6986111112
74.6176129172
New Data
100.0
100.0
100.0
8.00000000003
99.7916666667
42.435664564566

산출

52.6114082616 41.8319773432 75.6986111112 74.6176129172
100.0 100.0 100.0 8.00000000003 99.7916666667 42.435664564566

나는 전에 시도했습니다 xargs:

awk '{print$1}' file.txt  | xargs -n2 echo

하지만 여기에는 빈 줄이 포함되지 않습니다. 빈 줄도 필요합니다.

답변1

awk대체 구분 기호를 제공하는 데 사용됩니다 .

awk '/^New Data/ {sep=ORS; next} {printf "%s", sep $0; sep=OFS} END{print ""}' file

레코드가 정규식과 일치하면 ^New Data/ newline sep으로 변경되고 , 그렇지 않으면 /space 로 변경됩니다 .ORSsepOFS

답변2

펄 사용:

$ perl -lne '$\=" ";if (/New Data/){ $\="\n"; s/.*//g; } ;print $_;print "\n" if eof' file

52.6114082616 41.8319773432 75.6986111112 74.6176129172 
100.0 100.0 100.0 8.00000000003 99.7916666667 42.435664564566 

답변3

POSIX sed. sed의 패턴 공간에서는 새 데이터가 포함된 라인을 만날 때까지 읽은 모든 라인을 누적합니다. 이 시점에서 패턴 공간을 인쇄하고 삭제한 다음 sed 스크립트의 맨 위로 돌아가서 자세한 내용을 확인합니다. 패턴 공간에서 새로운 선두 데이터 라인을 잘라낸다는 점에 유의하는 것이 중요합니다. 테스트 명령 t는 다음 새 데이터가 나타날 때까지 계속해서 개행 문자를 공백으로 변환합니다. 그런 다음주기를 반복하십시오.

sed -e ':a
  $!N;/^New Data\n/D
  /\nNew Data$/! s/\n/ /;ta
  P;D
' file

GNU sed: 여기서는 예약된 공간에 새 데이터 라인이 아닌 데이터 라인을 축적합니다. 새 데이터 행이 발견되면(첫 번째 데이터 행이 삭제됨) 보존에 저장된 콘텐츠를 가져오고 보존을 지웁니다. 그런 다음 모든 줄 바꿈을 공백으로 변경하십시오.

sed -e '
  /^New Data$/!{H;$!d;}
  1d;z;x;s/.//;y/\n/ /
' file

Perl의 slurrp 모드: 전체 파일을 Perl의 패턴 공간 $_로 읽습니다.

옵션:

: `-0777` slurps the input intob$_. 
: `-l` sets   ORS = RS = \n
: `-a` autosplits the pattern space ibto fields and pytsin @F array. 
 `-n` no print the pattern space by default.
: `-F` specifies the field delimiter used to split the pattern space.

특수 변수:

 : `$"` value is space by default.
 : `$\ ` output record separator newline
 : `$#F` index of the last element of tge array @F, indices start from zero. 

perl -F'/^New\hData\n/m' -lan -0777e '
  print join $", split $\ for @F[1..$#F];
' file 


perl -lne '
  push @A, $_ if ! /^New Data$/;
  print join $", splice @A if eof || // && $.>1;
' file 


perl -lpe '
  ($_, $p, $\)
    = /New/ ? ($p, undef, defined $p ? $/ : $,)
    : ! eof ? ($p, $_,    defined $p ? $" : $,)
    :         (qq[$p$"$_], "foo", $/)
    ;
' file

산출:

52.6114082616 41.8319773432 75.6986111112 74.6176129172
100.0 100.0 100.0 8.00000000003 99.7916666667 42.435664564566

관련 정보