1

私はこれを行うために非常に複雑で長い複数条件付きステートメントを処理していますが、より簡単な方法を誰かが知っているかどうか疑問に思っていました。解析しようとしている複数列/複数行のリストがあります。私がする必要があるのは、5 番目の位置に「*」がある最初の行を取得し、それらすべてのエントリを次の数行の空白スペースにコピーしてから、元の一番上の行を破棄することです。これを少し複雑にしているのは、次の数行の他のすべてのフィールドに空のスペースがない場合があることです (元のリストの下半分を参照)。その場合は、余分なエントリ (以下の Q1) を取得し、行の最後に新しい列に配置します。

元のリスト:

A B C D ***** F G
    E1
    E2
    E3
Q R S T ***** V W
    U1
Q1  U2

最終出力:

A B C D E1 F G
A B C D E2 F G
A B C D E3 F G
Q R S T U1 V W
Q R S T U2 V W Q1

助けてくれてありがとう!

4

1 に答える 1

1

簡潔/不可解なワンライナー:

awk '/[*]/{f=$0;p="[*]+";next}{r=$2?$2:$1;sub(p,r,f);p=r;print $2?f" "$1:f}' file
A B C D E1 F G
A B C D E2 F G
A B C D E3 F G
Q R S T U1 V W
Q R S T U2 V W Q1

説明:

/[*]+/ {                  # If line matches line with pattern to replace
    line = $0             # Store line
    pat="[*]+"            # Store pattern
    next                  # Skip to next line
}
{
    if (NF==2)            # If the current line has 2 fields 
       replace = $2       # We want to replace with the second
    else                  # Else
       replace = $1       # We want to replace with first first

    sub(pat,replace,line) # Do the substitution
    pat=replace           # Next time the pattern to replace will have changed 

    if (NF==2)            # If the current line has 2 fields
       print line,$1      # Print the line with the replacement and the 1st field
    else                  # Else
       print line         # Just print the line with the replacement 
}

script.awkスクリプトを実行するには、 and runなどのファイルに保存しますawk -f script.awk file

于 2013-04-22T19:46:21.473 に答える