bash,在带有管道的命令中插入一个条件

时间:2014-12-22 15:10:14

标签: linux bash pipe conditional-statements

我需要使用另一个非常大的文件的某些字段创建一个文件,但前提是字段3为空。

其实我这样做:

cut -f 1,3,4,6 allCountries.txt | sort -u > cities_nostate.txt

然后,使用另一个脚本,我浏览 cities_nostate.txt 文件的所有行并检查所有字段,但这需要几个小时。

是否可以在命令中添加条件以快速过滤并删除所有无用的行(字段3不为空的行)?


接受答案后,我就是这样解决的:

awk -F'\t' '$3 == "" && $1 != "" && $4 != "" && $6 != "" {print $1, "\t", $4, "\t", $6}' allCountries.txt | sort -u > 

字段3必须为空,但其他所有字段均不为空。 我需要在打印字段之间使用制表符分隔符,因为每个字段中可能有空格。

2 个答案:

答案 0 :(得分:2)

您可以使用awk:

而不是cut
awk '$3 == "" {print $1,$3,$4,$6}' allCountries.txt | sort -u > cities_nostate.txt
仅当字段3为空时,

$3 == ""才会打印字段。

答案 1 :(得分:2)

如果您的字段由制表符分隔,并且您只想打印字段3为空的行,则可以使用:

awk -F'\t' '$3 == ""{print $1,$3,$4,$6}' allCountries.txt

在awk中,默认输入字段分隔符是任意数量的空格字符([[:space:]]+),因此您无法在不将其更改为其他字段的情况下检测到空字段。

要打印由制表符分隔的输出列,可以设置输出字段分隔符变量OFS。这可以在处理文件之前在BEGIN块中完成:

awk 'BEGIN{FS=OFS="\t"}$3 == ""{print $1,$3,$4,$6}' allCountries.txt

我已将输入字段分隔符同时分配给制表符。