我想这可能是一个幼稚的问题,但我无法理解,所以我想问......我正在寻找问题的一些解决方案,当我发现这篇非常有趣的帖子关于为什么[while|for]
在 bash 中使用循环被考虑不好的做法。帖子中有一个很好的解释(请参阅所选答案),但我找不到任何可以解决所讨论问题的内容。
我进行了广泛的搜索:我用谷歌搜索(或duckduckgo-ed)how to read a file in bash
并且我得到的所有结果都指向一个解决方案,根据上述帖子,该解决方案绝对是非 bash 风格并且应该避免的东西。特别是,我们有这个:
while read line; do
echo $line | cut -c3
done
Run Code Online (Sandbox Code Playgroud)
和这个:
for line in `cat file`; do
foo=`echo $line | awk '{print $2}'`
echo whatever $foo
done
Run Code Online (Sandbox Code Playgroud)
这被认为是非常糟糕的 shell 脚本示例。在这一点上,我想知道,这是实际的问题:如果应该避免发布的 while 循环,因为它们是不好的做法等等……我应该怎么做?
编辑:我看到我已经有评论/问题来解决while
循环的确切问题,所以我想扩大一下问题。基本上,我的理解是我需要更深入地研究 bash 命令,这才是我真正应该做的事情。但是,当人们四处搜索时,在一般情况下,人们似乎以不正确的方式使用和教授 bash(根据我的 google-ing)。
我发现了很多有关如何使用命令行重命名多个文件的问题。但是我无法解决重命名此文件名的具体问题:
something_4M_something_something_manyothersomethings.csv
Run Code Online (Sandbox Code Playgroud)
进入这个:
something_4_M_something_something_manyothersomethings.csv
Run Code Online (Sandbox Code Playgroud)
我需要的是将4M
字段拆分为4_M
但我无法做到这一点(注意:每个内容都用下划线分隔,还有许多其他字段,我相信这对于任务来说并不重要)。
我所做的是以下内容,但它不起作用,正如我所期望的那样,我认为这是正则表达式的问题,但我无法找出更好的方法:
rename -n 's/.4M/$&_4_M/' *
Run Code Online (Sandbox Code Playgroud)
另外,我不知道我写的东西到底是如何工作的,因为我在与此类似的问题之一的评论中发现了类似的内容,但我再也找不到它了。
我需要将一个文件(24 行)grep 成两个文件(有点大)。
原始文件包含与此字符串类似的 24 行:
AATGGACGCTTAAC[A|C|T][A|C|G]CGGC[A|T]TCGGAT
Run Code Online (Sandbox Code Playgroud)
我执行以下操作:
grep -f aList hugeFile_N*.csv | wc -l
4396868
Run Code Online (Sandbox Code Playgroud)
然后,为了仔细检查一切是否正常,我将文件分成两个文件,并通过另一个 grep 使用它们:
cat aList | head -n 12 > firstHalf
cat aList | tail -n +13 > secondHalf
grep -f firstHalf hugeFile_N*.csv | wc -l
2169008
grep -f secondHalf hugeFile_N*.csv | wc -l
2228046
Run Code Online (Sandbox Code Playgroud)
现在,我期望来自两个单独 grepped 文件的匹配总数等于我为原始文件找到的匹配数。但是,正如你所看到的:
2169008 + 2228046 = 4397054
4397054 != 4396868
Run Code Online (Sandbox Code Playgroud)
不是这种情况。我们有 186 场比赛缺失。这里发生了什么?
我还对(实际上非常简单的)文件进行了一些调查。在这里,我从两个独立的部分 grep 结果:
grep -f <(cat firstHalf secondHalf) hugeFile_N*.csv > together
Run Code Online (Sandbox Code Playgroud)
然后我分别 grep 两半:
grep …
Run Code Online (Sandbox Code Playgroud)