如何按特定列中的字符数截断文件

时间:2014-12-22 16:34:37

标签: python bash awk sed

我有4列,以;分隔。

第3或第4列中的某些行很大,超过10000个字符。

除了哪一列,一条特定列的长度超过10000个字符外,如何删除这些行?

我试过那个

awk '{i += (length() + 1); if (i <= 10000) print $ALL}' 

但是它取整个文件而不仅仅是特定的列,我想要列的长度,无论它是第3个还是第4个,或者两个都是。

TIA

4 个答案:

答案 0 :(得分:5)

您只需要:

$ cat file
a;b;c
d;efg;h
i;j;klm
opqr;s;t
uv;wx;yz

$ egrep -v '[^;]{3}' file
a;b;c
uv;wx;yz

$ awk '!/[^;]{3}/' file
a;b;c
uv;wx;yz

$ sed -r '/[^;]{3}/d' file
a;b;c
uv;wx;yz

更改&#34; 3&#34;到1001或其他......

答案 1 :(得分:4)

你可以使用这个awk:

awk -F ';' 'length($3)<10000 && length($4)<10000' file

这将只打印那些字段长度为3且小于10000的行。换句话说,如果这些列中的任何一列长度> = 10000,那么这些行将不会在输出中打印。

答案 2 :(得分:4)

通过sed,

sed '/^[^;]*;[^;]*;\([^;]\{10001\}[^;]*;[^;]*|[^;]*;[^;]\{10001\}[^;]*\)$/d' file

通过python,

import csv
with open('/path/to/input/file') as infile:
    reader = csv.reader(infile, delimiter=";")
    for row in reader:
        if len(row[2]) <= 10000 and len(row[3]) <= 10000:
            print(row)

答案 3 :(得分:4)

这应该有效:

sed -n '/[^;]\{10001\}/!p' input

或者这个:

sed '/[^;]\{10001\}/d' input