小编gab*_*abt的帖子

如果在 bash 中使用 while 读取循环进行文本处理很糟糕……那我该怎么办?

我想这可能是一个幼稚的问题,但我无法理解,所以我想问......我正在寻找问题的一些解决方案,当我发现这篇非常有趣的帖子关于为什么[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)。

shell bash shell-script

16
推荐指数
4
解决办法
4981
查看次数

如何通过更改文件名的一个组成部分来重命名多个文件?

我发现了很多有关如何使用命令行重命名多个文件的问题。但是我无法解决重命名此文件名的具体问题:

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)

另外,我不知道我写的东西到底是如何工作的,因为我在与此类似的问题之一的评论中发现了类似的内容,但我再也找不到它了。

regular-expression rename files

4
推荐指数
1
解决办法
725
查看次数

grep 如何返回不同数量的匹配项?

我需要将一个文件(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)

grep pattern-matching

2
推荐指数
1
解决办法
307
查看次数