【问题标题】:While loop skips the first line in outputWhile 循环跳过输出中的第一行
【发布时间】:2018-08-30 16:30:00
【问题描述】:

我在 Mac 上的终端中使用以下命令读取电子邮件地址文件并将其转换为 MD5 哈希。

tr -d " " < em.txt | tr '[:upper:]' '[:lower:]' | while read line; do 
(echo -n $line | md5); done | awk '{print $1}' > hashes1.txt

这会生成一个比原始输入文件短 1 行的哈希文件。但我不知道为什么。

这段代码做了一些事情,如下所示。

  1. 将电子邮件地址全部转换为小写
  2. 将电子邮件地址转换为 MD5 哈希
  3. 将新电子邮件地址列表输出到 hashes1.txt 文件

提前致谢!

【问题讨论】:

    标签: unix hash while-loop


    【解决方案1】:

    您的 命令错误:应该是:

    tr -d " " < em.txt |
        tr '[[:upper:]]' '[[:lower:]]' |
        while IFS= read -r line; do 
            echo -n "$line" | md5 | awk '{print $1}' >> hashes1.txt
        done
    

    while IFS= read -r line; do 
        echo -n "$line" | md5 | awk '{print $1}' >> hashes1.txt
    done < <(tr -d " " < em.txt | tr '[[:upper:]]' '[[:lower:]]')
    

    也更改了文件馈送位置。

    并确保您的文件没有带有

    的奇怪字符
    od -c file
    

    如果是,安装dos2unix,然后:

    dos2unix file
    

    或使用

    perl -i -pe 's/\r//g' file
    

    【讨论】:

    • 谢谢。当我使用该脚本时,它仍然会缩短 1 行。但这一次它切断了最后一行。我可以说它正在切断最后一行,因为我删除了“| md5”来检查并且最后一封电子邮件被切断了。
    • 试试od -c file 看看你是否没有奇怪的字符,比如windows 行尾\r\n:如果是,请更改它:dos2unix file
    • 是的,你是对的。该文件有\r\n。但是当我尝试使用 dos2unix 时,出现以下错误“-bash: dos2unix: command not found”。有什么建议吗?
    • 或使用:perl -i -pe 's/\r//g' file
    • 谢谢。不幸的是,当我尝试安装 brew "-bash: brew: command not found" 时出现此错误。但另一个问题。如果我删除 '\r\n',那么我的文本文件会变成 1 个长文本字符串而不是单独的电子邮件地址吗?
    猜你喜欢
    • 2012-08-30
    • 2017-04-07
    • 2018-09-18
    • 1970-01-01
    • 2013-04-23
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多