【问题标题】:Bash: Two "cut" functions in while-loop, only one effectiveBash:while循环中有两个“cut”函数,只有一个有效
【发布时间】:2021-07-16 16:57:40
【问题描述】:

在 cygwin 环境中,我想逐行读取 csv 行,并尝试从两列中获取值。 所以我有

 while read line ; do echo `cut -d";" -f5`; done < allk.lst

并显示正确的值。

但是:

while read line ; do echo `cut -d";" -f5`; echo `cut -d";" -f4`; done < allk.lst

再次像以前一样显示值...

显示这两个值的任何提示?

谢谢,博梅尔

【问题讨论】:

  • 我猜echo `cut -d";" -f5,4`; 会给你你所期望的。无论如何,您似乎必须阅读 shell 中的流重定向。你的脚本实际上在做什么可能不是你想象的那样。

标签: bash loops while-loop


【解决方案1】:
  1. cut -f 接受字段列表,因此无需调用cut 两次

    Using cut command to remove multiple columns

  2. echo cut -d";" -f5; 不符合您的预期。起初,变量line 丢失了。

应用这些修复后,您的命令将如下所示:

while read line; do echo $line | cut -d";" -f4-5 ; done < test.txt

Try a demo online!

【讨论】:

    【解决方案2】:

    嗯,先谢谢了。

    有些好奇:

    使用时

     $ time while read line; do echo $line | cut -d";" -f4-5 ; done < allk.txt
    K700W1666;S728A0103
    K700W1651;S727A7570
    K700W1654;S727A7579
    K700W1657;S727A7581
    K700W1660;S727A7582
    K700W3040;S728A0099
    K700W3043;S728A0107
    K700W3042;S732A4280
    K700W3594;S724A5213
    K700W3600;S727A7609
    K700W3603;S727A7615
    K700W3597;S727A7617
    K700W3604;S727A7589
    K700W3624;S728A1599
    K700W2164;S728A0091
    K700W2165;S728A0110
    K700W3565;S727A7577
    K700W3568;S727A7578
    K700W3560;S725A4806
    K700W3563;S725A8285
    K700W3559;S726A1925
    K700W3562;S728A0197
    K700W2016;S726A1929
    K700W2012;S725A5172
    K700W2015;S728A0056
    K700W2014;S728A0061
    K700W2017;S728A0067
    
    real    0m12.165s
    user    0m0.482s
    sys     0m1.390s
    

    需要12秒,中间有分号

    $ time while read line; do echo `cut -d";" -f4-5` ; done < allk.txt
    K700W1651;S727A7570 K700W1654;S727A7579 K700W1657;S727A7581 K700W1660;S727A7582 K700W3040;S728A0099 K700W3043;S728A0107 K700W3042;S732A4280 K700W3594;S724A5213 K700W3600;S727A7609 K700W3603;S727A7615 K700W3597;S727A7617 K700W3604;S727A7589 K700W3624;S728A1599 K700W2164;S728A0091 K700W2165;S728A0110 K700W3565;S727A7577 K700W3568;S727A7578 K700W3560;S725A4806 K700W3563;S725A8285 K700W3559;S726A1925 K700W3562;S728A0197 K700W2016;S726A1929 K700W2012;S725A5172 K700W2015;S728A0056 K700W2014;S728A0061 K700W2017;S728A0067
    
    real    0m0.308s
    user    0m0.015s
    sys     0m0.030s
    

    只需要 0.3 秒...但也需要一个半秒。 那么:在两个变量中读取这些值的最佳方法是什么(用于构建 SQL 命令)?

    【讨论】:

    • 这里通常不欢迎发布问题作为答案;也许一个新问题会更有意义。
    猜你喜欢
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    • 1970-01-01
    • 1970-01-01
    • 2018-12-24
    相关资源
    最近更新 更多