如何通过 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 脚本编写,例如通过使用 sed
、awk
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
我想删除此文本文件中包含空白的前 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 脚本编写,例如通过使用 sed
、awk
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