【问题标题】:Loop over lines character by character [duplicate]逐个字符循环遍历行[重复]
【发布时间】:2019-03-07 22:41:51
【问题描述】:

我试图将一系列字母视为一个数组,以便在 for 循环中逐行、逐个元素地循环遍历每个字母。

提取列后我的$data 看起来像:

ACACACACACA
CGCGCGCGGGG
TATATATAAAA
GAGAAAGAAGG
TGGTTTTGGTG

我的脚本:

for j in `cat $data` # go line by line
do
    for k in "${j[@]}" # go through each letter element by element
    do
        echo $k
    done
done

给出输出:

ACACACACACA
CGCGCGCGGGG
TATATATAAAA
...

我希望输出看起来像:

A
C
A
C
A
C
...
G
T
G

我的语法有问题吗?或者有没有更好的方法来调用该行的每个元素?

【问题讨论】:

  • 不确定这里的for 循环,但您可以执行cat $data | sed 's/./&\n/g' 来获得此输出。或awk:cat $data | awk 'BEGIN{FS="";OFS="\n"}{$1=$1}1'
  • 绝对应该是'echo'而不是'cat'。否则,该命令将尝试对一个名为任何文件的文件进行分类,这显然不是你想要的。
  • tr -d '\n' < "$data" | sed 's/./&\n/g'
  • echo ACACACACACA | awk 'BEGIN{FS=""}{for (i=1;i<=NF;i++){print $i}}' 可能会给你一个线索。祝你好运。

标签: bash shell for-loop unix


【解决方案1】:

假设它总是大写字母:

$ sed 's/[A-Z]/&\n/g' inputFile

或使用以下内容将任何字符和数字替换为相同的字符或数字,后跟换行符。

$ sed 's/./&\n/g' inputFile

或者,如果您有 fold 可用,

$ fold -w1 inputFile

fold 换行。使用-w1 选项,它会换行到1 的固定宽度。

【讨论】:

  • echo "ACGT" | sed 's/[A-Z]/&\n/g' 给了我AnCnGnTnecho "ACGT" | sed 's/./&\n/g' 也给了我AnCnGnTn。似乎不适合我?
【解决方案2】:

最短的选项:

fold -1 <<<"$data"

【讨论】:

    【解决方案3】:

    这不是纯粹的 bash,但这会让你得到你想要的:

    for j in `echo $data | grep -o .`
    do
      echo $j
    done
    

    grep 命令匹配每个字符并将其打印出来(或者在这种情况下,将其存储在变量 j 中,我假设您打算做的不仅仅是回显它)。

    【讨论】:

    • 为了我的启迪,您能解释一下为什么echo $data | grep -o . 有效,而echo $data | grep -o 无效(没有句号)吗?
    • @anita 那是因为grep 需要一个匹配的模式。当您省略 .(匹配任何字符)时,您会留下 grep 不确定要搜索的内容。
    猜你喜欢
    • 2014-06-29
    • 1970-01-01
    • 2016-11-19
    • 1970-01-01
    • 2018-10-15
    • 2013-01-18
    • 2015-06-18
    • 2019-08-07
    • 2010-12-02
    相关资源
    最近更新 更多