如何在unix中过滤列

时间:2017-07-30 18:42:37

标签: unix

我的查询是我有一个有11列的csv文件。我想提取有7列数字的记录。请注意第7列有字符串以及数字。使用awk命令但是没有工作

5 个答案:

答案 0 :(得分:1)

如果我理解,你想要7列的数字作为数字吗?

你可以使用grep来做到这一点。随着','作为分隔符:

grep ".*,.*,.*,.*,.*,.*,[0-9]*,.*" yourfile.csv

如果您只想要7列,请使用cut(-d =>分隔符,-f选择字段)

cat yourfile | cut -d, -f7 | grep "[0-9]*"

答案 1 :(得分:0)

我不知道您是否专门寻找bash命令,但我建议您使用像python这样的脚本语言。在python中实现它的一种方法是:

count = 0
prunedColumns = []
with open('FILENAME','r') as f:
    for line in f:
        count = 0
        for entry in line.split(','):
            try:
                float(entry)
                count += 1
            except ValueError:
                continue
            if count == 7:
                prunedColumns.append(line)
print(prunedColumns)

答案 2 :(得分:0)

首先是一些测试数据:

$ cat file
1 2 3 4 5 6 7 a b c d  # seven numbers, a hit
1 2 3 4 5 6 a b c d e  # six, a miss
1 2 3 4 5 6 7 8 a b c  # eight, a miss
1 2 3 4 5 6 7a b c d e # seven, a hit 

在awk中:

$ awk '{
    for((i=1)&&c=0;i<=NF;i++)  # check each field
        if($i~/[0-9]+/)        # if there are numbers in it
            c++                # iterate counter
} 
c==7                           # if there are 7 fields, print record
' file                      
1 2 3 4 5 6 7 a b c d  # seven numbers, a hit
1 2 3 4 5 6 7a b c d e # seven, a hit 

答案 3 :(得分:0)

在这里再尝试一种方法,使用与James Brown在帖子中使用的相同的Input_file。

awk '{val=$0;if(gsub(/[0-9]+/,"",val)==7){print}}'  Input_file

输出如下。

1 2 3 4 5 6 7 a b c d  # seven numbers, a hit
1 2 3 4 5 6 7a b c d e # seven, a hit

答案 4 :(得分:0)

cat file.csv | awk '{print $7}'| egrep -v [a-z]+