如何通过 linux shell 脚本从文本文件中删除包含空白的前 n 列

How to remove first n columns containing blanks from text file by linux shell scripting

我想删除此文本文件中包含空白的前 6 列 sample.txt

      2022-05-26 Mary  Jane
                 foo   bar
      2022-05-27 Tom   Powels
                 lorem ipsum
                 bar   foo
      2022-05-28 Honky Tonk
      2022-05-28 Hill  Billy
      ...

通过 linux shell 脚本编写,例如通过使用 sedawk and/or cut.

因此预期输出

2022-05-26 Mary  Jane
           foo   bar
2022-05-27 Tom   Powels
           lorem ipsum
           bar   foo
2022-05-28 Honky Tonk
2022-05-28 Hill  Billy
...

我在 SE 中搜索过,但只找到了删除每行开头所有空格的解决方案,例如

$ sed 's/^ *//' sample.txt > output.txt

生成此文件

2022-05-26 Mary  Jane
foo   bar
2022-05-27 Tom   Powels
lorem ipsum
bar   foo
2022-05-28 Honky Tonk
2022-05-28 Hill  Billy
...

列的格式丢失。

不幸的是sed

的这个调用
$ sed 's/^ {6}//' sample.txt > output.txt

无效。

因此,我如何通过 linux shell 脚本删除包含空白的前 6 列?

从文本文件中删除任意列可以通过 colrm 在 linux shell 上完成。 这个来自 IBM 的命令行工具记录在案 here.

因此,

可以从 sample.txt 中删除前 6 列
$ colrm 1 6 < sample.txt > output.txt

产生所需的输出

2022-05-26 Mary  Jane
           foo   bar
2022-05-27 Tom   Powels
           lorem ipsum
           bar   foo
2022-05-28 Honky Tonk
2022-05-28 Hill  Billy
...
 sed -E 's/^ {6}//' sample.txt > output.txt
 awk '{gsub(/^ {6}/,""); print > "output.txt"}' sample.txt
 

如果你需要从每行中删除n个字符,那么GNU AWK substr函数很方便,让file.txt内容是

  2022-05-26 Mary  Jane
             foo   bar
  2022-05-27 Tom   Powels
             lorem ipsum
             bar   foo
  2022-05-28 Honky Tonk
  2022-05-28 Hill  Billy
  ...

然后

awk '{print substr([=11=],7)}' file.txt

输出

2022-05-26 Mary  Jane
           foo   bar
2022-05-27 Tom   Powels
           lorem ipsum
           bar   foo
2022-05-28 Honky Tonk
2022-05-28 Hill  Billy
...

解释:当前行 ([=17=]) 的 print 部分从第 7 个字符开始。

(在 gawk 4.2.1 中测试)

这是蛮力,但可以完成工作:

mawk{1,2} NF++ FS='^      ' OFS=
{n,g}awk  NF++ FS='^ {6}'   OFS=

~

2022-05-26 Mary  Jane
           foo   bar
2022-05-27 Tom   Powels
           lorem ipsum
           bar   foo
2022-05-28 Honky Tonk
2022-05-28 Hill  Billy