알파벳 줄 텍스트를 쉘의 숫자 줄과 병합하는 방법은 무엇입니까?

알파벳 줄 텍스트를 쉘의 숫자 줄과 병합하는 방법은 무엇입니까?

다음과 같은 텍스트가 포함된 파일이 있습니다.

AAAA
BBBB
CCCC
DDDD

1234
5678
9012
3456

EEEE 

7890

등...

문자 행을 숫자 행과 일치시키고 싶으므로 다음과 같습니다.

AAAA 1234 
BBBB 5678
CCCC 9012
DDDD 3456

EEEE 7890

누구든지 이것을 달성하는 쉬운 방법을 알고 있습니까?

답변1

에서는 awk파일의 형식이 올바르다고 가정하고 빈 줄을 남겨두지만 파일을 확인하는 논리를 추가할 수 있습니다.

awk -v RS="" '{for(i=1; i<=NF; i++) a[i]=$i
  getline
  for(i=1; i<=NF; i++) print a[i] " " $i
  print ""}' file

답변2

<input sed -nr '/^[A-Z]{4}$/,/^$/w out1
                /^[0-9]{4}$/,/^$/w out2'
paste -d' ' out1 out2 |sed 's/^ $//' 

또는 한 단계로 수행하세요. 임시 파일이 필요하지 않습니다.

paste -d' ' <(sed -nr '/^[A-Z]{4}$/,/^$/p' input) \
            <(sed -nr '/^[0-9]{4}$/,/^$/p' input) | sed 's/^ $//' 

마지막 sed단계에서는 빈 줄의 구분 기호를 제거합니다 paste.

답변3

그것을 사용하는 한 가지 방법 perl:

콘텐츠 script.pl:

use warnings;
use strict;

## Check arguments.
die qq[Usage: perl $0 <input-file>\n] unless @ARGV == 1;

my (@alpha, @digit);

while ( <> ) {
        ## Omit blank lines.
        next if m/\A\s*\Z/;

        ## Remove leading and trailing spaces.
        s/\A\s*//;
        s/\s*\Z//;

        ## Save alphanumeric fields and fields with
        ## only digits to different arrays.
        if ( m/\A[[:alpha:]]+\Z/ ) {
                push @alpha, $_;
        }
        elsif ( m/\A[[:digit:]]+\Z/ ) {
                push @digit, $_;
        }
}

## Get same positions from both arrays and print them
## in the same line.
for my $i ( 0 .. $#alpha ) {
        printf qq[%s %s\n], $alpha[ $i ], $digit[ $i ];
}

콘텐츠 infile:

AAAA
BBBB
CCCC
DDDD

1234
5678
9012
3456

EEEE 

7890

다음과 같이 실행하세요:

perl script.pl infile

결과:

AAAA 1234
BBBB 5678
CCCC 9012
DDDD 3456
EEEE 7890

답변4

항목이 순서대로 있으면

  1. 다음 명령을 사용하여 입력을 알파벳 및 숫자 항목으로 분할합니다 grep.

    • grep "[[:alpha:]]\+" < file > alpha
    • grep "[[:digit:]]\+" < file > digit
  2. 생성된 두 파일을 연결하려면 다음 alphadigit사용하십시오 paste.

    • paste alpha digit-d " "( 탭 대신 공백을 사용하도록 추가할 수 있습니다 )

관련 정보