다음과 같은 텍스트가있는 파일이 있습니다.
AAAA
BBBB
CCCC
DDDD
1234
5678
9012
3456
EEEE
7890
기타…
그리고 나는 알파벳 라인을 숫자 라인과 일치시키기를 원합니다.
AAAA 1234
BBBB 5678
CCCC 9012
DDDD 3456
EEEE 7890
누구나 이것을 달성하는 간단한 방법을 알고 있습니까?
답변
한 가지 방법으로 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
답변
에서는 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
답변
<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
.
답변
emacs에서는 사각형 연산 을 사용 하여 텍스트 줄을 잘라 내고 숫자 줄 앞에 붙여 넣습니다.
답변
항목이 순서대로 있으면
-
다음을 사용하여 입력을 알파벳 항목과 숫자 항목으로 분할하십시오
grep
.grep "[[:alpha:]]\+" < file > alpha
grep "[[:digit:]]\+" < file > digit
-
두 결과 파일에 가입
alpha
및digit
사용paste
:paste alpha digit
(-d " "
탭 대신 공백을 사용하도록 추가 할 수 있습니다 )
답변
너무 나쁜 awk에는 좋은 푸시 / 팝 / 언 시프트 / 시프트 기능이 없습니다. 짧은 Perl 스 니펫이 있습니다.
perl -M5.010 -lne '
given ($_) {
when (/^[[:alpha:]]+$/) {push @alpha, $_}
when (/^\d+$/) {say shift(@alpha), " ", $_}
default {say}
}
'
답변
텍스트가있는 파일을 제공 pr
하고 아래와 같이 대체 구문을 사용 하고 처리하십시오.
$ pr -mt <(grep -i "^[a-z]" file.txt) <(grep -i "^[0-9]" file.txt)
AAAA 1234
BBBB 5678
CCCC 9012
DDDD 3456
EEEE 7890
으로 너비를 조정 -w9
하거나 공백을 제거 할 수 있습니다 sed "s/ //g"
.