用于截断文件每一行的 unix 命令

用于截断文件每一行的 unix 命令

我有一个 CSV 文件,我想从第三个分号开始截断它。例如,如果我有这个文件:

1;foo;bar;baz;x;y;z
2;foo;bar;baz;x;y;z
3;foo;bar;baz;x;y;z

我想得到以下输出:

1;foo;bar
2;foo;bar
3;foo;bar

我不知道我可以使用哪种 Unix 命令来实现这一点。你有什么建议?

请注意,此操作将在 KSH 脚本上完成。

答案1

为了多样化,这里有另一种方法cut

cut -d \; -f -3

答案2

这将完成你所要求的:

awk -F';' '{print $1 ";" $2 ";" $3;}' <input >output

awk实用程序专为这项任务而设计。它可以轻松地将单独的行分割成字段,然后基于此操作它们。参数-F';'告诉awk用作;字段分隔符。引号是必需的,因为如果没有引号,shell 会将其解释;为命令分隔符。

给 awk 的每一行(位)执行的命令同样被引用,'{print $1 ";" $2 ";" $3;}'以防止所有有趣的字符({}、和在本例中)被 shell 特殊处理,并确保整个字符被作为一个传递单元。$";awk

当然,<input>output是给予 shell 的重定向指令,用于将命令的输入和输出重定向到文件。

答案3

您可以使用 awk 来完成此操作,它不依赖于 shell。您需要将输出写入临时文件,然后将其移到现有文件的顶部。

awk -F';' 'BEGIN { OFS=";" } { print $1,$2,$3 }' file.txt > newfile.txt
mv newfile.txt file.txt 

答案4

使用 Perl

~$ perl -lane '   @F =  split(";"); print join ";", @F[0..2];'  file

使用乐(以前称为 Perl_6)

$~ raku   -ne 'my @F = .split(";");   put join ";", @F[0..2];'  file   

这里有两个分别使用 Perl 和 Raku 的答案。使用 Perl-lane或 Raku-ne非自动打印标志逐行读入数据。 (不同之处在于 Raku-l默认执行自动剪切,但 Raku 没有该-a标志)。

此后,代码实际上是相同的。在 Raku 中,您必须使用or (范围描述符)来声明@F(or @G、或@H数组等) 。 Raku 还要求您指出myour什么您正在调用的对象split.split是主题变量的$_.split缩写$_,它在读入时保存单独的数据行)。

最后,你要么print选择 (Perl),要么put选择 (Raku)。Rakuprint也有,但是put会为你添加一个换行符。

输入示例:

1;foo;bar;baz;x;y;z
2;foo;bar;baz;x;y;z
3;foo;bar;baz;x;y;z

示例输出:

1;foo;bar
2;foo;bar
3;foo;bar

Perl 参考资料:
https://perldoc.perl.org
https://www.perl.org

乐库参考资料:
https://docs.raku.org
https://raku.org

相关内容