【问题标题】:Length comparison of one specific field in linuxlinux中某一特定字段的长度比较
【发布时间】:2018-08-31 18:08:35
【问题描述】:

我试图检查 TSV 文件的第二个字段的长度(数十万行)。但是,它运行非常非常缓慢。我想应该是“回声”有问题,但不知道该怎么做。

输入文件:

prob    name
1.0     Claire
1.0     Mark
...     ...
0.9     GFGKHJGJGHKGDFUFULFD

所以我需要打印出名称中的问题所在。我用“head -100”的一个小例子进行了测试,它起作用了。但就是无法处理原始文件。

这是我跑的:

for title in `cat filename | cut -f2`;do
length=`echo -n $line | wc -m`
if [ "$length" -gt 10 ];then
echo $line
fi
done

【问题讨论】:

标签: linux shell


【解决方案1】:

awk救援:

awk 'length($2)>10' file

这将打印第二个字段长度超过 10 个字符的所有行。

请注意,它不需要任何块语句{...},因为如果满足条件,awk 将默认打印该行。

【讨论】:

  • 您的脚本是正确的,但需要解释几句。否则,您的回答也可能是“awk 救援,下次您想做任何事情时再在 Stack Overflow 上询问”。
  • 谢谢!我不太了解awk,但它似乎很有用。我会了解的。
【解决方案2】:

如果有帮助,我们可以使用 awk。

awk '{if(length($2) > 10){print}}' filename

$2 这里是文件名中的第二个字段,它为每一行运行。它会更快。

【讨论】:

  • length($2) > 10 之外的所有内容在该 awk 脚本中都是不必要的。
【解决方案3】:

不妨试试这个:

cat file.tsv | awk '{if (length($2) > 10) print $0;}'

这应该会快一点,因为整个处理由单个 awk 进程完成,而您的解决方案在每次循环迭代时启动 2 个进程以进行比较。

【讨论】:

  • 会快很多。但是你应该去掉cat的无用使用,就像我对Shravan说的那样,除了length($2) > 10之外的一切都是不必要的。
  • @TomFenech 当然,只是为了完美。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-29
  • 1970-01-01
  • 1970-01-01
  • 2019-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多