-1

以下のようにファイルの内容を変更するには、メソッド (awk/perl/sed/shell) が必要です。

前:

123456|ABCDEF|123|011|A|E|NULL|R|UNKNOWN|A1|A2|B1|B2|C1|C2|2013|2013|9999|Y

後:

123456|ABCDEF|123|011|A|E|NULL|R|UNKNOWN|9999|Y|A1|B1|C1|NULL|NULL|NULL|2013|2013

最後の 2 列を 9 列目の後に移動し、列 11、13、15 を削除してNULL|NULL|NULL、14 列目と 15 列目の間に挿入する必要があります ( C1|2013)。ヒントをいただければ幸いです。cutコマンドは挿入の順序を変更できないため、別の方法で行う必要があります。入力ファイルにはそのような行が 1,000 万あり、これを行う最善の方法を探しています。

4

4 に答える 4

4

醜い質問には醜い解決策が必要です:

awk -F"|" '{
    for(i=1;i<=9;i++) { printf "%s|" ,$i }
    printf "%s|%s|",$(NF-1),$NF
    for(i=10;i<16;i+=2) { printf "%s|" ,$i }
    printf "%s|%s|%s|","NULL","NULL","NULL"
    for(i=16;i<(NF-2);i++) { printf "%s|" ,$i }
    print $(NF-2)
}' inputFile
于 2013-06-21T21:21:52.567 に答える
2

GNU のコード:

sed -r 's/((\w+\|){9})(\w+\|)\w+\|(\w+\|)\w+\|(\w+\|)\w+(\|\w+\|)(\w+)\|(\w+\|\w+)/\1\8|\3\4\5NULL|NULL|NULL\6\7/' file

$cat ファイル
123456|ABCDEF|123|011|A|E|NULL|R|不明|A1|A2|B1|B2|C1|C2|2013|2013|9999|Y

$sed -r 's/((\w+\|){9})(\w+\|)\w+\|(\w+\|)\w+\|(\w+\|)\w+(\|\ w+\|)(\w+)\|(\w+\|\w+)/\1\8|\3\4\5NULL|NULL|NULL\6\7/' ファイル
123456|ABCDEF|123|011|A|E|NULL|R|UNKNOWN|9999|Y|A1|B1|C1|NULL|NULL|NULL|2013|2013
于 2013-06-21T22:03:54.380 に答える
0

列を数えたくありませんが、次の perl スクリプトからアイデアを得ることができます。

perl -F'/\|/' -lanE 'say join("|", $F[2], "NULL", "NULL", $F[0], $F[3], $F[1])'

入力用

123456|ABCDEF|123|011

生産する

123|NULL|NULL|123456|011|ABCDEF

このモードは文字の各行autosplitを分割し、|必要に応じてフィールドを並べ替えることができます。はjoinフィールドを と一緒に結合します|

楽しみのために-純粋なbash-そして遅い:)

while IFS='|' read -r a b c d
do
echo "$a|NULL|$d|$c|NULL|$b"
done << EOF
123456|ABCDEF|123|011
EOF

版画

123456|NULL|011|123|NULL|ABCDEF
于 2013-06-21T21:30:56.937 に答える