繁体   English   中英

AWK 根据 csv 中的字段数写入文件

[英]AWK write to a file based on number of fields in csv

我想遍历一个 csv 文件并在写入一个没有所有列的文件时丢弃行。

我有一个像这样的输入文件mtest.csv

IP@#Process@#Device@#ID
TestIP1@#TestProcess2@#TestDevice1@#TestID1
TestIP2@#TestProcess2@#TestDevice2
TestIP3@#TestProcess3@#TestDevice3@#TestID3

但我试图只写那些存在所有 4 列的行记录。 输出不应包含 TestIP2 列完整行,因为它有 3 列。

示例输出应如下所示:

IP@#Process@#Device@#ID
TestIP1@#TestProcess2@#TestDevice1@#TestID1
TestIP3@#TestProcess3@#TestDevice3@#TestID3

我以前这样做是为了更早地获取所有列,但它也写入了具有 3 列的 TestIP2 行

awk -F "\@#" '{print $1"\@#"substr($2,1,50)"\@#"substr($3,1,50)"\@#"substr($4,1,50)}' mtest.csv >output2.csv

但是当我尝试确保它在所有 4 列都存在时写入文件时,它不起作用

awk -F "\@#", 'NF >3 {print $1"\@#"substr($2,1,50)"\@#"substr($3,1,50)"\@#"substr($4,1,50); exit}' mtest.csv >output2.csv

你让事情变得比需要的更难。 您需要做的就是检查NF==4以输出包含四个字段的任何记录。 您的总awk表达式将是:

awk -F'@#' NF==4 < mtest.csv

注意: awk的默认操作是print因此不需要显式print 。)

示例使用/输出

使用mtest.csv的示例输入,您将收到:

$ awk -F'@#' NF==4 < mtest.csv
IP@#Process@#Device@#ID
TestIP1@#TestProcess2@#TestDevice1@#TestID1
TestIP3@#TestProcess3@#TestDevice3@#TestID3

感谢 David 和 vukung

您的两个解决方案都可以。我想写入一个文件,以便我也可以修剪每个字段的长度

我认为以下声明有效

awk -F "@#" 'NF>3 {print $1"\@#"substr($2,1,50)"\@#"substr($3,1,2)"\@#"substr($4,1,3)}'  mtest.csv >output2.csv

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM