다음과 같은 텍스트가 포함된 파일이 있습니다.
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 " "
탭 대신 공백을 사용하도록 추가할 수 있음)