SED(または他のcoreutil)を使用してCSV列形式を再指定する

SED(または他のcoreutil)を使用してCSV列形式を再指定する

hashdeepの出力ファイルの次のフラグメントが提供されます。

7241,11111111111111111111111111111111,\01-data\file1
1237241,22222222222222222222222222222222,\01-data\file2
41,33333333333333333333333333333333,\01-data\file3

次のようにフォーマットするにはどうすればよいですか?

   7241,11111111111111111111111111111111,\01-data\file1
1237241,22222222222222222222222222222222,\01-data\file2
     41,33333333333333333333333333333333,\01-data\file3

sedを使いたいのですが(これが私が慣れ始めたので)、特定の列に現れる文字だけを変更するようにsedに指示する方法はありますか?

もちろん、他の方法があれば喜んでお知らせします。

-j0その理由は、hashdeepで(シングルスレッド)オプションを使用せずに2つの出力ファイルを比較できるように、ファイル名の出力をソートしたいからです。

答え1

そしてawk

awk -v l="$(wc -L <file)" '{printf "%"l"s\n", $0}' file
  • -vawk変数に外部値を割り当てますl
    • wc -L <fileファイル内の最長行の長さを探します。
  • printf "%"l"s\n", $0各行を印刷して空白で埋めますl。 10個のスペースの場合、次のようになりますprintf "%10s\n", $0

出力:

   7241,11111111111111111111111111111111,\01-data\file1
1237241,22222222222222222222222222222222,\01-data\file2
     41,33333333333333333333333333333333,\01-data\file3

答え2

sed -e:, -e's/^[^,]\{0,6\},/ &/;t,'

行の先頭に7つ以上のカンマ以外の文字があるまで少し繰り返します。ただし、コンマの後にカンマ以外の文字がすでに7文字未満の場合、何もしません。したがって、空白行やコンマと一致しない行、またはカンマと一致するがすでにカンマではない7行以上で始まる行には影響しません。

ループも非常に安価です。自動デバイスは、コンマまたはカンマではなく、2種類の文字のみを考慮するだけで、指定された時間に最大7つを考慮します。


   7241,11111111111111111111111111111111,\01-data\file1
1237241,22222222222222222222222222222222,\01-data\file2
     41,33333333333333333333333333333333,\01-data\file3

答え3

廃止予定のsed入力内容をコピーしてLibreoffice Calcに貼り付け、選択して貼り付けで「カンマ区切り」オプションを選択し、以下のように各データ型を別々の列に入力しました。

私の考えは非常に簡単な解決策です。

7241    11111111111111100000000000000000    \01-data\file1 

1237241 22222222222222200000000000000000    \01-data\file2

41      33333333333333300000000000000000    \01-data\file3

答え4

質問はよくわかりませんでしたが、ファイル名でソートしたいと思いますか?その場合は、以下を使用してくださいsort

sort -t , -k 3 my_file.txt

関連情報