我需要使用另一个非常大的文件的某些字段创建一个文件,但前提是字段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必须为空,但其他所有字段均不为空。 我需要在打印字段之间使用制表符分隔符,因为每个字段中可能有空格。
答案 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
我已将输入字段分隔符同时分配给制表符。