我想要遍历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我过去常常这样做,以便更早地获取所有列,但它也会写入TestIP2行,它有3列
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发布于 2020-09-06 16:29:59
你正在让事情变得比需要的更难。您所需要做的就是检查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发布于 2020-09-06 18:14:08
感谢David和vukung
您的两种解决方案都很好。我想写入一个文件,这样我也可以裁剪每个字段的长度
我认为下面这句话是可行的。
awk -F "@#" 'NF>3 {print $1"\@#"substr($2,1,50)"\@#"substr($3,1,2)"\@#"substr($4,1,3)}' mtest.csv >output2.csvhttps://stackoverflow.com/questions/63762100
复制相似问题