Цикл по строкам символ за символом

Я пытаюсь рассматривать серию букв как массив, чтобы перебирать каждую букву в цикле 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

Что-то не так с моим синтаксисом? Или есть лучший способ вызвать каждый элемент строки?


person anita    schedule 02.10.2018    source источник
comment
Не уверен в цикле for здесь, но вы можете просто выполнить cat $data | sed 's/./&\n/g', чтобы получить этот вывод. Или с awk: cat $data | awk 'BEGIN{FS="";OFS="\n"}{$1=$1}1'   -  person JNevill    schedule 02.10.2018
comment
Это определенно должно быть «эхо», а не «кошка». В противном случае эта команда попытается найти файл с любым именем в ваших данных, что явно не то, что вам нужно.   -  person JasonK    schedule 02.10.2018
comment
echo ACACACACACA | awk 'BEGIN{FS=""}{for (i=1;i<=NF;i++){print $i}}' может дать вам подсказку. Удачи.   -  person shellter    schedule 02.10.2018


Ответы (3)


Это не чистый bash, но это дает вам то, что вам нужно:

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

Команда grep сопоставляет каждый отдельный символ и распечатывает его (или, в данном случае, сохраняет его в переменной j, где я предполагаю, что вы намереваетесь сделать больше, чем просто вывести его).

person JasonK    schedule 02.10.2018
comment
Для моего назидания, не могли бы вы объяснить, почему echo $data | grep -o . работает, но не echo $data | grep -o (без точки)? - person anita; 03.10.2018
comment
@anita Это потому, что grep нужен шаблон для сопоставления. Когда вы опускаете . (соответствует любому символу), вы оставляете grep неуверенным в том, что искать. - person hidefromkgb; 03.10.2018

Самый короткий вариант:

fold -1 <<<"$data"
person hidefromkgb    schedule 02.10.2018

Предполагая, что это всегда заглавные буквы:

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

или используйте следующее, чтобы заменить любой символ и число тем же символом или числом, за которым следует новая строка.

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

ИЛИ, если у вас есть fold,

$ fold -w1 inputFile

fold переносит строку. С опцией -w1 он переносится на фиксированную ширину 1.

person iamauser    schedule 02.10.2018
comment
echo "ACGT" | sed 's/[A-Z]/&\n/g' дает мне AnCnGnTn, а echo "ACGT" | sed 's/./&\n/g' также дает мне AnCnGnTn. Кажется, у меня не работает? - person anita; 03.10.2018