ファイルから特殊文字を削除し、フィールド区切り文字を保持します。

ファイルから特殊文字を削除し、フィールド区切り文字を保持します。

固定長ファイルの最初の列のすべての特殊文字を削除できましたが、その結果、すべての後続の列は削除された文字数だけ左に移動します。スペースで区切られたファイルです。入力ファイルの行1が破損しています。 2号線は次の通りでなければなりません。文字列000022000362700は、両方の行の49番目の位置で始まります。私が経験している問題は、3つの特殊文字を削除した後にフィールドが46位置に移動することです。

GAVISCON リキッドミント 000022000362700 159588000007979400 50001584182 0006S020000
GAVISCONリキッドミントOT 000022000362700 159588000007979400 50001584182 0006S020000

私が使用するコマンドは次のとおりです。

cat file.txt | grep '[^ - ~]' | sed's/[^ - ~]//g'

これにより、次のような出力が生成されます。

    GAVISCON LIQUID PEPPERMINT OT        000022000362700   159588000007979400  50001584182        0006S020000

特殊文字を削除すると、変更されたフィールドの右側にある各フィールドが左に移動され、フィールドの開始位置が変更されました。

しばらく検索してみましたが、この問題に対する解決策が見つかりませんでした。

どうすればいいですか?

答え1

次のコマンドを使用します。

sed -r 's/(\^|-|~)/ /g' file.txt
  • sed -r

    -r, --regexp-extended
    スクリプトで拡張正規表現を使用します。

  • / /フィールド区切り文字として使用されるスペース(またはその他の文字列)

  • (\^|-|~)

    • 最初のキャプチャグループ(\^|-|~)

      • 最初のオプション:\^

        \^^リテラル一致文字

      • 2番目のオプション:-

        --リテラル一致文字

      • 3番目のオプション:~

        ~~リテラル一致文字

もう一つのバリエーションはこれです(ありがとう@コスタス):

sed 's/[-~^]/ /g' file.txt
  • [^-~]

    • [-~^]以下のリストにある単一の文字と一致します。

      -~^リストの単一-~^文字

答え2

sed's/[^ - ~]//g'間違ったコマンドについてのみ文句を言うので、使用したコマンドではない可能性があります。常にコピーして貼り付けてください!

どうやら逃げたようですねsed 's/[^ -~]//g'。これは、印刷可能なASCII文字ではなく、すべての文字を空の文字列に置き換えます。つまり、印刷できないすべてのASCII文字が削除されます。 (これはデフォルトのロケール、つまり以下に該当しますが、LC_ALL=C他の多くのロケールでは該当しません。)

列の並べ替えを維持するには、印刷できない各文字を空白に置き換えます。

sed 's/[^ -~]/ /g'

コマンドによってgrep印刷できない文字を含む行のみが出力に表示されます。その必要はありませんgrep。変更が不要な行は、sed出力の正しい位置に表示されます。

<file.txt LC_ALL=C sed 's/[^ -~]/ /g' >new-file.txt

これにより、列の途中にスペースが追加されます。たとえば、次のようになります。

GAVISCON LIQUID PEPPERMINT    OT        000022000362700   159588000007979400  50001584182        0006S020000

空白が列の右側で終わるようにするには、次のようにします。

GAVISCON LIQUID PEPPERMINT OT           000022000362700   159588000007979400  50001584182        0006S020000

柱が止まる場所を示す別のアプローチが必要です。これはsedでも可能ですが、awkでははるかに簡単です。最初の列から印刷できない文字を削除し、位置49から始まる他の列のデータを保持する方法は次のとおりです。

<file.txt LC_ALL=C awk '{
    first_column = substr($0, 1, 48);
    gsub(/[^ -~]/, "", first_column);
    printf "%-48s%s\n", first_column, substr($0, 49)
}' >new-file.txt

関連情報