データがこのように繰り返される長いテキストファイルがあります。
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
各グループの最初の行を結合して行を形成し、完了するまで各グループの2番目の行を繰り返したいと思います。 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
)をタップして行を1つにマージします。