Обработка индекса строк

Совершенно другой подход будет использовать GNU Parallel и использовать его - заголовок и - Параметры :

cat input.csv | parallel --header : --pipe -N 10 'cat > output{#}.csv'

Это получится Вы 11 строк в каждом из файлов (строка заголовка плюс десять из -N 10 , за исключением последнего файла, написанного таким образом).

0
02.08.2014, 10:42
3 ответа

Как насчет следующего awk Сценарий:

#!/usr/bin/awk -f
BEGIN {
        FS="\t"
        print "#key\tstring\tpos(string)\tApos(string)"
}

{
        out=""
        printf "%s\t",$0
        split($2,str,"")
        gsub(/ /,"",$3)
        split($3,pos,",")
        for (i in pos){
                if (str[pos[i]]=="A"){
                        out = out pos[i] ", "
                }
        }
        gsub(/, $/,"",out)
        print out
}

Сохранить его как (например) finda.awk и сделать его исполняемым с помощью chmod + x finda.awk .

Затем запустите его против ваших входных данных и перенаправляйте вывод в новый файл:

./findA.awk input.txt > output.txt
cat output.txt
#key    string  pos(string) Apos(string)
key1    AA000AA000000AAA0A  2, 3, 18, 12    2, 18
key2    00A00AAA000AAAA00A  3, 18   3, 18

Вывод не так уделяется, как ваш пример, как он является разграниченным вкладом (согласно вашему запросу), а ширина вкладки не Выровняйте с шириной различных струн.

1
28.01.2020, 02:28

Я не уверен, как вы сейчас это делаете (было бы полезно увидеть ваш код на Python), но вы можете создать список элементов столбца 3, которые указывают на 'A' в столбце 2 так:

.

[i for i в COLUMN3 if COLUMN2[i]=='A']

Это кажется простой проблемой, но, возможно, я не до конца понимаю ее. Возможно, вы забываете, что строки - это итерабельные?

.
1
28.01.2020, 02:28

Ужасная perl:

$ perl -anle '
    printf "%s    Apos(string)\n",$_ and next if /^#/;
    printf "%s",$_;
    $len = 12 - length((split(/\s+/,$_,3))[-1]);
    for $pos_ss (@F[2..$#F]) {
        $char = substr($F[1],int($pos_ss)-1,1);
        push @res, int($pos_ss) if $char eq 'A';
    }
    printf "%@{[12-4+$len]}s\n", join ", ",@res;
    @res=();
' file
#key    string              pos(string)    Apos(string)
key1    AA000AA000000AAA0A  2, 3, 18, 12   2, 18
key2    00A00AAA000AAAA00A  3, 18          3, 18

Она работает аналогично моему решению для этого ответа, плюс добавление переменной $len для расчета формата, необходимого для печати последнего выровненного столбца.

1
28.01.2020, 02:28

Теги

Похожие вопросы