다음과 같은 텍스트가 포함된 파일이 있습니다.
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
항목이 순서대로 있으면
다음 명령을 사용하여 입력을 알파벳 및 숫자 항목으로 분할합니다
grep
.grep "[[:alpha:]]\+" < file > alpha
grep "[[:digit:]]\+" < file > digit
생성된 두 파일을 연결하려면 다음
alpha
을digit
사용하십시오paste
.paste alpha digit
-d " "
( 탭 대신 공백을 사용하도록 추가할 수 있습니다 )