列中的返回值小于或等于4个字符

时间:2017-04-04 14:38:31

标签: linux csv unix grep

我有一个包含一些数据的csv文件。我需要在第二列中搜索长度小于或等于4个字符的任何字符串,然后返回匹配的行。

some.csv文件:

MA,BEVM3,BEVERLY,52,31
VT,EXJV1,ESSEX JUNCTION N,49,29
ME,FISM1,FT KENT,41,20
MA,OXFM3,BUFFUMVILLE LAKE,52,30
MA,TLLM3,TULLY LAKE,52,28
NH,MNCN3,MASSABESIC LAKE,52,31
ME,GREM1,SEBEC LAKE,45,23
ME,CLTM1,CLAYTON LAKE,42,19
ME,GRAM1,GRAND LAKE STREAM,46,27
VT,SLNV1,SOUTH LINCOLN,45,26
NH,MCDN3,EDWARD MACDOWELL LAKE,49,30
MA,BOS,BOSTON,51,37
MA,BROM3,BROCKTON,53,32
MA,CHH,CHATHAM,47,36
MA,ORH,WORCESTER,50,33
ME,KGYX,GRAY,48,30
MA,AQW,N ADAMS HARRIMAN AP,52,30
MA,KTAN,TAUNTON MUNI AP,54,32
MA,KPYM,PLYMOUTH MUNI AP,51,32

代码:

awk -F',' '$2<=4' some.csv

这不是我所期待的......是否有更好的方法来执行此任务?

4 个答案:

答案 0 :(得分:2)

试试这个 -

awk -F, '{if(length($2) <= 4) print $0}' f
MA,BOS,BOSTON,51,37
MA,CHH,CHATHAM,47,36
MA,ORH,WORCESTER,50,33
ME,KGYX,GRAY,48,30
MA,AQW,N ADAMS HARRIMAN AP,52,30
MA,KTAN,TAUNTON MUNI AP,54,32
MA,KPYM,PLYMOUTH MUNI AP,51,32

答案 1 :(得分:1)

请使用正则表达式。

/[A-Za-z0-9]{1,4}/g

答案 2 :(得分:0)

如果需要,您可以使用bash。使用循环和if编码,如:

#!/bin/bash

filename="/root/some.csv"

while read -r line
do
value=`echo $line | awk -F ',' '{print $2}' | wc -c`
value=$((value - 1))
if [ $value  -lt 5 ]
then
echo $line
fi
done < "$filename"

答案 3 :(得分:0)

使用 sed 工具的替代方法:

sed -n '/^[^,]*,[^,]\{1,4\},/p' some.csv

输出:

MA,BOS,BOSTON,51,37
MA,CHH,CHATHAM,47,36
MA,ORH,WORCESTER,50,33
ME,KGYX,GRAY,48,30
MA,AQW,N ADAMS HARRIMAN AP,52,30
MA,KTAN,TAUNTON MUNI AP,54,32
MA,KPYM,PLYMOUTH MUNI AP,51,32

使用 grep 工具可以实现同样的效果:

grep '^[^,]*,[^,]\{1,4\},' some.csv