截断文件每一行的unix命令

Rom*_*las 5 ksh text-processing csv

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

1;foo;bar;baz;x;y;z
2;foo;bar;baz;x;y;z
3;foo;bar;baz;x;y;z
Run Code Online (Sandbox Code Playgroud)

我想获得以下输出:

1;foo;bar
2;foo;bar
3;foo;bar
Run Code Online (Sandbox Code Playgroud)

我不知道我可以使用什么样的 Unix 命令。你有什么建议?

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

Chr*_*own 17

为了多样化,这是另一种方式cut

cut -d \; -f -3
Run Code Online (Sandbox Code Playgroud)

  • @gt6989b 不,那会打印第三个字段。`-3` 表示打印包括第三个字段在内的所有字段。 (2认同)

Omn*_*ous 6

这将完成您的要求:

awk -F';' '{print $1 ";" $2 ";" $3;}' <input >output
Run Code Online (Sandbox Code Playgroud)

awk实用程序非常适合此任务。它可以轻松地将单独的线切割成字段,然后基于此操作它们。该-F';'参数告诉awk使用;的字段分隔符。引号是必需的,因为;没有它们,shell 会解释为命令分隔符。

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

而且,当然,<input>output是重定向指令被赋予外壳命令的输入和输出,并到一个文件重定向。

  • 当前的大多数 `awk` 都允许这种更短的方式:`awk -F';' -vOFS=';' 'NF=3'`。(有额外的预防措施:`awk -F';' -vOFS=';' 'NF&gt;3{NF=3}1'`。) (5认同)