문제

아래와 같은 단일 줄에 데이터가 있습니다.

abc edf xyz rfg yeg udh

아래와 같이 데이터를 제시하고 싶습니다

abc
xyz
yeg


edf
rfg
udh

대체 필드는 Newline 분리 된 상태로 인쇄됩니다. 이것에 대한 라이너 하나가 있습니까?

도움이 되었습니까?

해결책

다음과 같은 awk 스크립트를 수행 할 수 있습니다.

> echo 'abc edf xyz rfg yeg udh' | awk '{
    for (i = 1;i<=NF;i+=2){print $i}
    print "";
    for (i = 2;i<=NF;i+=2){print $i}
    }'
abc
xyz
yeg

edf
rfg
udh

다른 팁

위의 awk (4 라인)와 같은 정신의 파이썬 :

$ echo 'abc edf xyz rfg yeg udh' | python -c 'f=raw_input().split()
> for x in f[::2]: print x
> print
> for x in f[1::2]: print x'

Python 1-liner (동일한 파이프 생략) :

$ python -c 'f=raw_input().split(); print "\n".join(f[::2] + [""] + f[1::2])'

다른 Perl 5 버전 :

#!/usr/bin/env perl
use Modern::Perl;
use List::MoreUtils qw(part);

my $line = 'abc edf xyz rfg yeg udh';

my @fields = split /\s+/, $line; # split on whitespace

# Divide into odd and even-indexed elements
my $i = 0;
my ($first, $second) = part { $i++ % 2 }  @fields;

# print them out
say for @$first;
say '';          # Newline
say for @$second;

이전의 Perl 답변이 너무 길다는 것은 부끄러운 일입니다. 다음은 두 개의 Perl One-Liners입니다.

echo 'abc edf xyz rfg yeg udh'|
  perl -naE '++$i%2 and say for @F; ++$j%2 and say for "",@F'

이전 버전의 PERL ( "say"없음)에서는 다음을 사용할 수 있습니다.

echo 'abc edf xyz rfg yeg udh'|
  perl -nae 'push @{$a[++$i%2]},"$_\n" for "",@F; print map{@$_}@a;'

비교를 위해 여기에 몇 가지 Perl 스크립트가 있습니다 (결국 TMTOWTDI). 다소 기능적인 스타일 :

#!/usr/bin/perl -p

use strict;
use warnings;

my @a = split;
my @i = map { $_ * 2 } 0 .. $#a / 2;
print join("\n", @a[@i]), "\n\n",
      join("\n", @a[map { $_ + 1 } @i]), "\n";

우리는 또한 AWK 스크립트에 더 가까이 할 수 있습니다.

#!/usr/bin/perl -p

use strict;
use warnings;

my @a = split;
my @i = map { $_ * 2 } 0 .. $#a / 2;
print "$a[$_]\n" for @i;
print "\n";
print "$a[$_+1]\n" for @i;

나는 그것을 할 수있는 방법이 부족하기 때문에 다른 영리한 perlers가 다른 방법을 생각해 내면 자유롭게 추가하십시오.

다른 Perl 솔루션 :

use strict;
use warnings;

while (<>)
{
    my @a = split;
    my @b = map { $a[2 * ($_%(@a/2)) + int($_ / (@a /2))]  . "\n" } (0 .. @a-1); 
    print join("\n", @a[0..((@b/2)-1)], '', @a[(@b/2)..@b-1], '');
}

당신은 그것을 진짜 1 라이너로 압축 할 수도 있습니다.

perl -nwle'my @a = split;my @b = map { $a[2 * ($_%(@a/2)) + int($_ / (@a /2))]  . "\n" } (0 .. @a-1);print join("\n", @a[0..((@b/2)-1)], "", @a[(@b/2)..@b-1], "");'

다음은 너무 문학적이고 비판적이지 않은 초고준입니다 awk 버전:

awk '{printf "%s\n%s\n%s\n\n%s\n%s\n%s\n",$1,$3,$5,$2,$4,$6}'

중첩 루프를 사용하여 약간 더 길다 (두 문자) (마지막에 추가 신형 인쇄) :

awk '{for(i=1;i<=2;i++){for(j=i;j<=NF;j+=2)print $j;print ""}}'

추가 Newline을 인쇄하지 않습니다.

awk '{for(i=1;i<=2;i++){for(j=i;j<=NF;j+=2)print $j;if(i==1)print ""}}'

비교하려고, Paxdiablo모든 불필요한 문자가 제거 된 버전 (1, 9 또는 11 문자) :

awk '{for(i=1;i<=NF;i+=2)print $i;print "";for(i=2;i<=NF;i+=2)print $i}'

다음은 모든 배치 버전입니다.

d=(abc edf xyz rfg yeg udh)
i="0 2 4 1 3 5"
for w in $i
do
    echo ${d[$w]}
    [[ $w == 4 ]]&&echo
done

Haskell에서의 나의 시도 :

Prelude> (\(x,y) -> putStr $ unlines $ map snd (x ++ [(True, "")] ++ y)) $ List.partition fst $ zip (cycle [True, False]) (words "abc edf xyz rfg yeg udh")
abc
xyz
yeg

edf
rfg
udh
Prelude>

당신은 또한 tr을 사용할 수도 있습니다.echo "abc edf xyz rfg yeg udh" | tr ' ' '\n'

비교를위한 루비 버전 :

ARGF.each do |line|
  groups = line.split
  0.step(groups.length-1, 2) { |x| puts groups[x] }
  puts
  1.step(groups.length-1, 2) { |x| puts groups[x] }
end

ARGF.each do |line|
  groups = line.split
  puts groups.select { |x| groups.index(x) % 2 == 0 }
  puts
  puts groups.select { |x| groups.index(x) % 2 != 0 }
end
$ echo 'abc edf xyz rfg yeg udh' |awk -vRS=" " 'NR%2;NR%2==0{_[++d]=$0}END{for(i=1;i<=d;i++)print _[i]}'
abc
xyz
yeg
edf
rfg
udh

최신의 경우, 나는 당신에게 스스로를 떠나게합니다.

다음은 배쉬를 사용하여 라인에서 수동으로 재 배열하는 또 다른 방법입니다. 배열로의 이전 변환이 있습니다.

echo 'abc edf xyz rfg yeg udh' | while read tline; do twrds=($(echo $tline)); echo -e "${twrd[0]} \n${twrd[2]} \n${twrd[4]} \n\n ${twrd[1]} \n${twrd[3]} \n${twrd[5]} \n" ; done 

건배!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top