[英]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.