使用 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 上使用(单线程)选项。

答案1

awk

awk -v l="$(wc -L <file)" '{printf "%"l"s\n", $0}' file
  • -v将外部值赋给awk变量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 个或更多非逗号开头的行。

该循环也非常便宜 - 自动机只需要考虑两种字符 - 逗号或非逗号 - 并且在任何给定时间最多只考虑其中的 7 个。


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

答案3

不使用sed.我复制了您的输入并粘贴到 Libreofffice 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

相关内容