我有一个 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 还要求您指出my
our
什么您正在调用的对象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