【问题标题】:how to truncate file by number of characters in a specific column如何按特定列中的字符数截断文件
【发布时间】:2015-02-20 18:53:14
【问题描述】:

我有 4 列,用 ; 分隔。

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

您将如何删除行,无论哪一列,其中一个特定列的长度超过 10000 个字符?

我试过了

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

但它会占用整个文件,而不仅仅是特定的列,而且我想要列的长度,不管它是第 3 个还是第 4 个,或者两者兼而有之。

TIA

【问题讨论】:

  • 如果第三列或第四列的长度超过 10000 个字符,您要删除整行吗?
  • 嗨,Etan,整条线。

标签: python regex bash awk sed


【解决方案1】:

你只需要:

$ 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

将“3”更改为 1001 或其他...

【讨论】:

  • 次要 nitpick - egrepdeprecated 但 ++ 为简单起见。
【解决方案2】:

你可以使用这个 awk:

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

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

【讨论】:

  • 谢谢阿努巴瓦。这更像是一个 OR ,我是这么想的 awk -F ';' 'length($3)&lt;10000 || length($4)&lt;10000' file
  • 但是你写了How would you remove the lines , regardless of which columns , where the length of one specific column goes beyond 10000 characters?
  • 我是这样想的:如果第 3 列 > 10000 个字符,再见,但如果第 4 列 > 10000 个字符,也再见。是你理解的吗?
  • 这里应用了一点布尔逻辑。如果为了简洁起见,我们将条件称为length($3) &gt;= 10000A,类似地,将$4 的条件称为B。那么你想要删除一行的条件是A || Bawk 想要的保持线路的条件是! (A || B),根据德摩根定律,它等价于!A &amp;&amp; !B。这正是上面@anubhava 提供的条件所代表的......
  • 谢谢@twalberg:这就是我试图在我的答案下面用简单的话解释的内容,但你的布尔逻辑让它一清二楚。
【解决方案3】:

这应该可行:

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

或者这个:

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

【讨论】:

  • 你领先我几秒,点个赞吧!我知道这回答了 OP 的问题,但我会使用这个:sed '/\(^\|;\)[^;]\{10001\}/d' input 作为更一般的答案(也适用于第一列)。
  • 你说得对,我是过失。我真的需要再来一杯咖啡。
【解决方案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)

【讨论】:

  • 对于 sed 我猜 .\{10001\} 不起作用,您需要一个 [^;]\{10001\},因为可能采用了分隔符,它不应该
猜你喜欢
  • 2020-04-13
  • 1970-01-01
  • 2015-04-21
  • 1970-01-01
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多