4

如何删除文件中包含超过给定数量字母的所有行?例如

bear
rabbit
tree
elephant

如果我将其限制为 5 个字母或更少的单词,输出将是:

bear
tree
  • 该文件包含各种外来字符,每个外来字符都应计为一个字母。
  • 标点符号也可以算作一个字母。
4

4 回答 4

19
$ awk 'length<=5' input.txt
bear
tree
于 2012-04-12T06:43:55.217 回答
8

以下方法可以解决问题:

sed -i '/^.\{5,\}$/d' FILE

这意味着:

删除 ( / [...] /d) 就地 ( -iswitch ) 与以下模式匹配的所有行:

  • 行首 ( ^)
  • 后跟任意字符 ( .) 重复 5 次或更多次 ( \{5,\})
  • 后跟行尾 ( $)

从名为FILE.

于 2012-04-12T06:42:54.890 回答
4
grep -v '......' myfile.txt

将提供五个字符或更少的行。

它通过“选择”包含六个或更多字符的行来执行此操作,然后使用-v, 反转操作以仅打印出匹配的行。

于 2012-04-12T06:35:12.677 回答
1

“该文件包含各种外来字符,每个都应算作一个字母。” 假设您的输入数据是 UTF8,这个 bash 过滤器脚本应该这样做。

#!/bin/bash
function px {
 local a="$@"
 local i=0
 while [ $i -lt ${#a}  ]
  do
   printf \\x${a:$i:2}
   i=$(($i+2))
  done
}
(iconv -f UTF8 -t UTF16 | od -x |  cut -b 9- | xargs -n 1) |
if read utf16header
then
 px $utf16header
 cnt=0
 out=''
 while read line
  do
   cnt=$(($cnt+1))
   if [ "$line" == "000a" ]
    then
     if [[ $cnt -le 5+1 ]] ; then
      out=$out$line
      px $out
     fi
     cnt=0
     out=''
   else
    out=$out$line
   fi
  done
fi | iconv -f UTF16 -t UTF8
于 2012-04-12T08:26:34.903 回答