unixコマンドを使用してキーと値のペアを含むテキストファイルをソートされた出力に変換する方法

unixコマンドを使用してキーと値のペアを含むテキストファイルをソートされた出力に変換する方法

さまざまな変数に可能な値の範囲を含むテキストファイルがあります。

1. life:        short,long,na.
2. weather_f:   cloudy,rainy,sunny,foggy,cold,warm,mild,
                    humid,na.
3. sea_temp:    warm,mild,cold,na.

以下のような出力ファイルを取得したいと思います。

short,long,na
cloudy,rainy,sunny,foggy,cold,warm,mild,humid,na
warm,mild,cold,na

私はこれを試してみましたsedが、新しいラインweather_fのために困難を経験しました。予想される結果をどのように取得できますか?

ベストアンサー1

行がカンマで終わったら、すぐに次の行をバッファに追加します。これはsed式を使用して行われます。

/,$/N

このNコマンドは、改行文字を2つの区切り文字として使用して、バッファ内のテキストに次の行を追加します。

これらの連続した複数行を許可するには、ループの先頭に戻り、バッファーの末尾にコンマがあることを確認してください。

:again
/,$/ {
    N

    # branch to the "again" label at the top
    b again
}

その後、バッファに行を追加する必要はなくなり、線を切り取り、必要に応じて配置できます。これには、最初の文字の前のすべての項目の削除、スペースに:似たすべての文字(挿入された改行を含むN)の削除、および末尾の点の削除が含まれます。

s/[^:]*://
s/[[:space:]]//g
s/\.$//

完全な編集スクリプトは次のとおりです。

:again
/,$/ {
    N
    b again
}
s/[^:]*://
s/[[:space:]]//g
s/\.$//

これはファイル(ここ)のスクリプトを使用してscript行うことができます。

sed -f script file

または、コマンドラインにスクリプトを入力するには

sed -e :again \
    -e '/,$/ { N; b again; }' \
    -e 's/[^:]*://' \
    -e 's/[[:space:]]//g' \
    -e 's/\.$//' file

あなたの質問にデータが与えられると、次のものが出力されます。

short,long,na
cloudy,rainy,sunny,foggy,cold,warm,mild,humid,na
warm,mild,cold,na

一部の実装には独自の表現がsed必要な場合があります。b again

sed -e :again \
    -e '/,$/ { N' -e 'b again' -e '}' \
    -e 's/[^:]*://' \
    -e 's/[[:space:]]//g' \
    -e 's/\.$//' file

おすすめ記事