【问题标题】:awk length is counting +1awk 长度正在计数 +1
【发布时间】:2018-06-26 13:26:10
【问题描述】:

作为练习,我正在尝试输出字典中每个可能长度的单词数量。 这是我的代码:

$ awk '{print length}' dico.txt | sort -nr | uniq -c

这是输出:

...
1799 5
427 4
81 3
1 2

我的问题是 awk 长度为我的文件中的每个单词多计算一个字母。正确的输出应该是:

1799 4
427 3
81 2
1 1

我检查了我的文件,它的单词后面没有空格:

ABAISSA
ABAISSABLE
ABAISSABLES
ABAISSAI
...

所以我猜想 awk 将换行符算作一个字符,尽管事实上它不应该如此。 有什么解决办法吗?还是我做错了什么?

【问题讨论】:

  • 你能提供一个minimal reproducible example吗?另外,尝试显示cat -vet dico.txt 的输出:有时会出现奇怪的字符并且难以跟踪。
  • 我不确定你的意思是什么对不起。但是如果你想要的话,你可以在这里下载dico.txt:siteduzero.com/uploads/fr/ftp/mateo21/cpp/dico.zip
  • 我的意思是问题应该是自包含的,所以您应该提供一个有意义的文件示例,我们可以用它“播放”并重现错误,以帮助您找到解决方案.

标签: bash awk


【解决方案1】:

我会冒险猜测。您的 awk 不是期待“U*X”样式的换行符 (LF),但您的 dico.txt 具有 Windows 样式 (CR+LF)。这很容易让您在所有长度上都获得 +1。


我拿了你的四个字:

$ cat dico.txt 
ABAISSA
ABAISSABLE
ABAISSABLES
ABAISSAI

然后跑你的线:

$ awk '{print length}' dico.txt | sort -nr | uniq -c
      1 11
      1 10
      1 8
      1 7

到目前为止一切顺利。现在一样,但 dico.txt 带有 windows 换行符:

$ cat dico.txt  | todos > dico_win.txt 
$ awk '{print length}' dico_win.txt | sort -nr | uniq -c
      1 12
      1 11
      1 9
      1 8

【讨论】:

  • 现在,您已经上传了文件...确实猜对了。
  • 你猜对了。这正是问题所在。所以我只是把我的文件通过 dos2unix 来解决它。谢谢!!
猜你喜欢
  • 1970-01-01
  • 2016-12-07
  • 2011-08-22
  • 2012-03-10
  • 2018-11-05
  • 1970-01-01
  • 2016-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多