0

解析する必要がある大きなファイル (~20GB) があります。整数で始まらないすべての行をマージする必要があります。ファイルは次のようになります。

     1647 Lorem ipsum dolor sit amet, consectetur adipisicing elit
     1906 ut perspiciatis unde omnis iste natus error sit 
     1909  Nemo enim ipsam voluptatem
            dolores eos qui ratione
       quia non numquam eius
         nisi ut aliquid ex ea com
     1820 zt enim ad minim veniam

最後に、次のようにする必要があります。

     1647 Lorem ipsum dolor sit amet, consectetur adipisicing elit
     1906 ut perspiciatis unde omnis iste natus error sit 
     1909  Nemo enim ipsam voluptatem dolores eos qui ratione quia non numquam eius nisi ut aliquid ex ea com
     1820 zt enim ad minim veniam

たとえば、次のように多くのことを試しました。

レジストリを使用すると...小さなファイルではうまく機能し、大きなファイルではメモリが不足します

sed ':a;N;$!ba;s/\n[\t ]*\([a-zA-Z]\+\)/ \1/g'

ホールド バッファを使用する (これは整数で始まる行だけを出力します):

sed -n '
/^[ \t]\+[0-9]\+/ {
    p
    h
}
/^[ \t]\+[0-9]\+/ !{
    H
}
'

また:

sed -n '
/^[ \t]\+[0-9]\+/ b jumpTO
        H
        $ b jumpTO
        b
:jumpTO
x
p
'

整数のない行からスペースとタブを置き換えるコードがありません。それらは重要ではなく、実装するのは簡単です。

コードを見て、私が間違っていることを指摘してください。 ありがとうございました

4

6 に答える 6

1

sed=)で不可能なことはありません

sed -n '/^[0-9]/{x;p};/^[^0-9]/{H;x;s/\n\s*\([^0-9]\)/ \1/;x};${x;p}'

1647 Lorem ipsum dolor sit amet, consectetur adipisicing elit
1906 ut perspiciatis unde omnis iste natus error sit
1909  Nemo enim ipsam voluptatem dolores eos qui ratione quia non numquam eius nisi ut aliquid ex ea com
1820 zt enim ad minim veniam
于 2012-07-30T11:36:29.473 に答える
1

これはあなたのために働くかもしれません:

->nawk '{if($1~"^[a-zA-Z]"){p=p" "$0;flag=1}else{if(flag==1)print p;p=$0;print p;flag=0}}' temp

> cat temp
1906 ut perspiciatis unde omnis iste natus error sit 
1909  Nemo enim ipsam voluptatem
dolores eos qui ratione
quia non numquam eius
nisi ut aliquid ex ea com
1820 zt enim ad minim veniam

> nawk '{if($1~"^[a-zA-Z]"){p=p" "$0;flag=1}else{if(flag==1)print p;p=$0;print p;flag=0}}' temp
1906 ut perspiciatis unde omnis iste natus error sit 
1909  Nemo enim ipsam voluptatem
1909  Nemo enim ipsam voluptatem dolores eos qui ratione quia non numquam eius nisi ut aliquid ex ea com
1820 zt enim ad minim veniam

>
于 2012-07-30T11:21:27.767 に答える
1

使用する1つの方法awk

awk '/[0-9]/ { if (line) print line; line = $0; next } { sub(/^[ \t]+/, " "); line = line $0 } END { print line }' file.txt

結果:

     1647 Lorem ipsum dolor sit amet, consectetur adipisicing elit
     1906 ut perspiciatis unde omnis iste natus error sit 
     1909  Nemo enim ipsam voluptatem dolores eos qui ratione quia non numquam eius nisi ut aliquid ex ea com
     1820 zt enim ad minim veniam
于 2012-07-30T11:23:19.397 に答える
1

sedは、行ごとに動作するように設計されているため、行を結合するのは一般的にあまり得意ではありません。

を使用したソリューションのawk方が優れている場合があります。

入力.txt:

$ cat input.txt
1647 Lorem ipsum dolor sit amet, consectetur adipisicing elit
1906 ut perspiciatis unde omnis iste natus error sit 
1909  Nemo enim ipsam voluptatem
       dolores eos qui ratione
  quia non numquam eius
    nisi ut aliquid ex ea com
1820 zt enim ad minim veniam

script.awk:

/^[0-9]+/ {
    if (NR==1) {
        printf "%s", $0
    } else {
        printf "\n%s", $0
    }
}

/^[^0-9]+/ {
    gsub(/^ /,"",$0);
    gsub(/ $/,"",$0);
    printf "%s", $0
}

END {
    printf "\n"
}

出力:

$ awk -f script.awk input.txt
1647 Lorem ipsum dolor sit amet, consectetur adipisicing elit
1906 ut perspiciatis unde omnis iste natus error sit 
1909  Nemo enim ipsam voluptatemdolores eos qui rationequia non numquam eiusnisi ut aliquid ex ea com
1820 zt enim ad minim veniam

更新: 空白を削除するための改善されたコード

于 2012-07-30T10:17:33.120 に答える
1

これはうまくいくかもしれません(GNU sed):

sed ':a;$!N;s/\n\s*\([^0-9 ]\)/ \1/;ta;P;D' file
于 2012-07-30T12:48:32.513 に答える
1

このワンライナーは役に立ちますか?(あら)

 awk '$1~/[0-9]+/{printf "\n"$0;next}{printf $0}' yourfile

テスト

kent$  cat test.txt
1647 Lorem ipsum dolor sit amet, consectetur adipisicing elit
1906 ut perspiciatis unde omnis iste natus error sit 
1909  Nemo enim ipsam voluptatem
       dolores eos qui ratione
  quia non numquam eius
    nisi ut aliquid ex ea com
1820 zt enim ad minim veniam

kent$  awk '$1~/[0-9]+/{printf "\n"$0;next}{printf $0}' test.txt

1647 Lorem ipsum dolor sit amet, consectetur adipisicing elit
1906 ut perspiciatis unde omnis iste natus error sit 
1909  Nemo enim ipsam voluptatem       dolores eos qui ratione  quia non numquam eius    nisi ut aliquid ex ea com
1820 zt enim ad minim veniam
于 2012-07-30T10:29:54.810 に答える