使用 SED(或任何其他 coreutil)重新格式化 CSV 列式

Rob*_*ins 6 sed text-processing

鉴于来自 hashdeep 的输出文件的以下组成部分:

7241,11111111111111111111111111111111,\01-data\file1
1237241,22222222222222222222222222222222,\01-data\file2
41,33333333333333333333333333333333,\01-data\file3
Run Code Online (Sandbox Code Playgroud)

我将如何将其格式化为:

   7241,11111111111111111111111111111111,\01-data\file1
1237241,22222222222222222222222222222222,\01-data\file2
     41,33333333333333333333333333333333,\01-data\file3
Run Code Online (Sandbox Code Playgroud)

我想使用 sed (因为这是我开始掌握的),但是有没有办法告诉 sed 仅在特定列或特定列中出现字符时才更改字符?

当然,如果有其他方法可以做到这一点,我也会很高兴听到这个消息。

这样做的原因是我想根据文件名对输出进行排序,以便我可以比较两个输出文件,而不必-j0在 hashdeep 上使用(单线程)选项。

cha*_*aos 8

awk

awk -v l="$(wc -L <file)" '{printf "%"l"s\n", $0}' file
Run Code Online (Sandbox Code Playgroud)
  • -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
Run Code Online (Sandbox Code Playgroud)


mik*_*erv 6

sed -e:, -e's/^[^,]\{0,6\},/ &/;t,'
Run Code Online (Sandbox Code Playgroud)

它只是做一个小循环,直到一行的开头至少有 7 个非逗号。但是,如果那里已经有少于 7 个非逗号且后面紧跟一个逗号,它只会做任何事情。因此它不会影响空行或不匹配逗号的行,或者那些匹配但已经以 7 个或更多非逗号开头的行。

循环也很便宜——自动机只需要考虑两种字符——那些是或不是逗号——并且在任何给定时间最多只有 7 个字符。


   7241,11111111111111111111111111111111,\01-data\file1
1237241,22222222222222222222222222222222,\01-data\file2
     41,33333333333333333333333333333333,\01-data\file3
Run Code Online (Sandbox Code Playgroud)