데이터가 이렇게 반복되는 긴 텍스트 파일이 있습니다.
510068893
510069716
620087756
510068729
620089710
560034147
510069875
M
M
M
M
M
M
M
1957
5/2/1980
1960
1978
5/8/1988
1984
1981
ABASSI FADHIL KHAMIS
ABDALLA HAMAD JUMA
ABDALLA ALI MAHADHI
ABDALLA ALI MFAKI
ABDALLA HAMAD KHAMIS
ABDALLA JUMA ALI
ABDALLA JUMA MABROUK
Sokoni
Sokoni
Sokoni
Sokoni
Sokoni
Sokoni
Sokoni
510068695
510068680
620086828
560034266
620088288
560033477
510068873
M
M
M
M
M
M
M
5/10/1983
1985
1937
1951
1974
14/5/1984
1987
ABDALLA KHAMIS ALI
ABDALLA KHAMIS HAMAD
ABDALLA KHAMIS USHURU
ABDALLA MOHAMMED JUMA
ABDALLA MOHAMMED SALEH
ABDALLA OMAR ABEID
ABDALLA OMAR NUHU
Sokoni
Sokoni
Sokoni
Sokoni
Sokoni
Sokoni
Sokoni
각 그룹의 첫 번째 행을 결합하여 행을 형성하고 완료될 때까지 각 그룹의 두 번째 행을 반복하고 싶습니다. Vim이나 Perl 스크립트를 사용하여 이 작업을 수행하려면 어떻게 해야 합니까?
출력은 다음과 같습니다.
510068893, M, 1957, ABASSI FADHIL KHAMIS, Sokoni 510069716, M, 5/2/1980, ABDALLA HAMAD JUMA, Sokoni
620087756, M, 1960, ABDALLA ALI MAHADHI, Sokoni 510068729, M, 1978, ABDALLA ALI MFAKI, Sokoni
etc.
답변1
항상 7개 항목(및 빈 줄)에 대한 데이터를 수집해야 하는 경우 이 awk
프로그램은 해당 데이터를 수집하여 마지막에 인쇄합니다.
awk '{a[NR%8]=a[NR%8]" "$0} END{for (i=1;i<=7;i++) print a[i]}'
(귀하의 데이터 샘플에는 후행 공백이 많이 있는 것으로 보입니다. 이러한 공백을 추가하지 않고 제거하고 싶다면 질문을 적절하게 조정해 주시면 그에 따라 답변을 조정해 드리겠습니다.)
편집: 위 주석의 예제 출력에 표시된 대로 쉼표 구분 기호를 만들려면 다음을 사용합니다.
awk '{a[NR%8]=a[NR%8]", "$0} END{for (i=1;i<=7;i++) print substr(a[i],3)}'
답변2
gawk ' BEGIN{RS=""; FS="\n"}
{for(i=1;i<NF;i++) {a[i]=a[i]" || "$i} }
END {for(i in a){ print a[i]}}'
(이 솔루션은 행 순서를 변경할 수 있습니다. 다음 버전에서는 행 순서가 유지됩니다.)
더 나은 방법은 이를 개선하고 재사용 가능한 명령 "vert_transpose"를 만드는 것입니다.
#!/usr/bin/gawk -f
BEGIN {RS=""; FS="\n"}
l<=NF {l=NF}
{for(i=1;i<=NF;i++) { a[i]=a[i]" || "$i } }
END {for(i=1;i<=l ;i++) { print a[i] } }
chmod를 설치하고 $HOME/bin
필요한 경우 스톡 명령으로 사용하십시오.
- 배쉬에서:
vert_transpose longfile
- vim 내부:
:%! vert_transpose
답변3
각 줄에서 후행 공백을 제거하고 끝에 빈 줄을 추가하려면 다음을 수행하세요.
sed 's/\s*$//;$a\\' very.long.text.file
배관 가능
awk '
BEGIN{
RS="\n\n"
FS="\n"}
{for (i=1;i<=NF;i++)
A[i]=A[i] s $i
s=","}
NR%5==0{
for(i in A)
printf "%s,%g\n" ,A[i]
s=""
delete A
print s}'
대용량 파일에 맞게 40번째 줄마다 메모리를 지웁니다.
답변4
Ctrl+를 사용 V하여 시각적 차단을 활성화하고 결합하려는 행을 선택한 다음 Shift+ J(예: 대문자 J
)를 탭하여 행을 하나로 병합합니다.