2

次のようなデータファイルがあります。

 xyz123            2.000    -0.3974     0.0  hij123       
                                          6.0  lmn123      
                                          8.7  efg123      
                                         13.9  uvw123      
                                         28.5  rst123       
 abc123            10.000     0.1943     0.0  wxy123       
                                         10.7  xyz123       
                                         19.9  pqr123     
                                         20.6  stu123      
                                         20.6  klm123      
 def123            50.000    -0.2595    19.2  jkl123      
                                         26.1  stu123      
                                         27.1  def123     
                                         27.1  ghi123     
                                         27.6  abc123

* uvw123 15.000 -0.3635

 lmn123            40.000    -0.3695     19.2  jkl123      
                                         26.1  stu123      
                                         27.1  def123     
                                         27.1  ghi123     
                                         27.6  abc123

私はそれを次のように変換する必要があります:

xyz123,2.000,-0.3974,0.0,hij123       
xyz123,2.000,-0.3974,6.0,lmn123      
xyz123,2.000,-0.3974,8.7,efg123      
xyz123,2.000,-0.3974,13.9,uvw123      
xyz123,2.000,-0.3974,28.5,rst123       
abc123,10.000,0.1943,0.0,wxy123       
abc123,10.000,0.1943,10.7,xyz123       
abc123,10.000,0.1943,19.9,pqr123     
abc123,10.000,0.1943,20.6,stu123      
abc123,10.000,0.1943,20.6,klm123      
def123,50.000,-0.2595,19.2,jkl123      
def123,50.000,-0.2595,26.1,stu123      
def123,50.000,-0.2595,27.1,def123     
def123,50.000,-0.2595,27.1,ghi123     
def123,50.000,-0.2595,27.6,abc123

* uvw123,15.000、-0.3635、

lmn123,40.000,-0.3695,19.2,jkl123      
lmn123,40.000,-0.3695,26.1,stu123      
lmn123,40.000,-0.3695,27.1,def123     
lmn123,40.000,-0.3695,27.1,ghi123     
lmn123,40.000,-0.3695,27.6,abc123

Python、AWK、またはsedを使用してこれを行うにはどうすればよいですか?

更新:入力データに「uvw12315.000 -0.3635」のような行があり、aixのPythonコードを使用すると、この行が台無しになります。コードを変更して、私が示したような行を正しく出力する方法はありますか?

4

8 に答える 8

1

Pythonソリューションは次のとおりです。

import re

with open('data.txt') as f:
  prev = []
  for line in f:
    tok = [t for t in re.split(r'\s+', line.rstrip()) if t]
    if len(tok) < len(prev):
      tok = prev[:-len(tok)] + tok
    print ','.join(tok)
    prev = tok

各列の最新の値(in)を追跡し、それをprev使用して現在の行の欠落している列にデータを入力します。

于 2012-05-23T15:16:05.193 に答える
1
awk 'BEGIN {OFS = ","} NF == 5 {a = $1; b = $2; c = $3; $1 = $1; print; next} {$4 = $1; $5 = $2; $1 = a; $2 = b; $3 = c; print}' inputfile

複数の行に分割:

awk 'BEGIN {
        OFS = ","
    } 
    NF == 5 {
        a = $1; 
        b = $2; 
        c = $3; 
        $1 = $1; 
        print; 
        next
    } 
    {
        $4 = $1; 
        $5 = $2; 
        $1 = a; 
        $2 = b; 
        $3 = c; 
        print
    }' inputfile

これを行う$1 = $1と、ラインが新しいで再組み立てされますOFS

于 2012-05-24T02:41:58.353 に答える
0

awkの使用:

awk 'BEGIN{OFS="\t";} NF==2{print a,b,c,$1,$2}{};NF==5{a=$1; b=$2; c=$3;print $1,$2,$3,$4,$5}{}' logfile 

これにより、最初に出力フィールドセパレータがタブに設定され(必要に応じてこれを変更できます)、次に行に含まれる列の数を確認します。5つある場合は、最初の3つを変数a、b、およびcに等しく設定してから、それらをすべて出力します。

列が2つしかない場合は、a、b、c(つまり、最後の完全な行の最初の3列)に続いて、この行の2つの列が出力されます。

アップデート:

3列しかない行に気づかなかった!以下のawkコマンドは、指定したとおりの出力を提供するはずです。

awk 'BEGIN{OFS="\t";} $1~/^[a-z]/{a=$1; b=$2; c=$3;print $1,$2,$3,$4,$5}{}$1!~/^[a-z]/{print a,b,c,$1,$2}{}' logfile

これは以前と同様に機能しますが、列の数ではなく、最初のフィールドが文字で始まっているかどうかを確認します。この正規表現は、必要に応じてより具体的にすることができます。

于 2012-06-14T16:13:17.850 に答える
0

awkおよびtr)ソリューション、特にエレガントではありません:

awk 'BEGIN { OFS = ","}
  { if (NF == 5) {
    split($0, a); print $1, $2, $3, $4, $5
  } else {
    print a[1], a[2], a[3], $1, $2
  } }' | tr -d ' \t'
于 2012-05-23T16:36:57.253 に答える
0

ファイルがタブ区切りであると仮定します。

各行を繰り返して、各行に適用できますsplit("\t")

for line in lines:
    result = line.split("\t")

len(result)が5の場合、新しいセクションにヒットします。値をそのまま解凍できます

h1, h2, h3, v1, v2 = result

そうでなければ、それは

v1, v2 = result

次に、を使用して変数を出力できます",".join([h1, h2, h3, v1, v2])

2番目の問題については、ファイル内の非表示の文字が表示されていないと、わかりにくいです。たとえば、viの「セットリスト」を使用してそれらを見ることができます。

于 2012-06-14T15:58:52.163 に答える
0

awkで:

awk 'BEGIN {OFS=","} /^[^ ]/ {f1=$1; f2=$2; f3=$3; f4=$4; f5=$5} /^[ ]/ {f4=$1; f5=$2}  {print f1,f2,f3,f4,f5}' < input.txt
于 2012-06-14T16:09:10.953 に答える
0

このようなことを試して始めることができます-

awk 'NF>3{a=$1;b=$2;c=$3;$1=$1;print;next}NF<3{d=$1;e=$2;print a,b,c,d,e;next}{$1=$1;}1' OFS=',' file
于 2012-06-14T16:52:09.077 に答える
-1

単純なgrepで実行できます

$ cat so.txt 
xyz123 2.000 -0.3974 0.0 hij123
6.0 lmn123
8.7 efg123
13.9 uvw123
28.5 rst123
abc123 10.000 0.1943 0.0 wxy123
10.7 xyz123
19.9 pqr123
20.6 stu123
20.6 klm123
def123 50.000 -0.2595 19.2 jkl123
26.1 stu123
27.1 def123
27.1 ghi123
27.6 abc123
$ cat so.txt | grep "-"
xyz123 2.000 -0.3974 0.0 hij123
def123 50.000 -0.2595 19.2 jkl123
于 2012-05-23T15:17:32.453 に答える