Управлять файлом CSV с помощью сценария удара или Python, преобразовывающего определенные строки в столбец

Я имею к файлу CSV с 6 столбцами, я хочу записать сценарий с помощью Python или удара так, чтобы я мог генерировать новый файл, может быть txtfile, где для каждого располагает первые три столбца в ряд, остается тем же, которое является (столбец 1, 2 и 3 остается в тех же строках), но следующие три столбца т.е. (столбец 4, 5, 6) вставляются в новую строку чуть ниже их там предыдущих строк. Я присоединил изображение своего файла, может кто-то помогать мне с тем же

Моя внешность файла примера:

Column1   Column2    Column3     Column4    Column5      Column6                              
chr16    2697996    2697997     chr16      2086192      2086193  
chr5    112801382   112801383   chr5       138445682    138445683     
chr15   26869333    26869334    chr8       119416385    119416386

Мой Заключительный файл должен быть похожим

Column1  Column2     Column3  
chr16   2697996     2697997  
chr16   2086192     2086193  
chr5    112801382   112801383  
chr5    138445682   138445683  
chr15   26869333    26869334  
chr8    119416385   119416386
1
задан 17 July 2018 в 08:15

2 ответа

Вот awk подход:

$ awk 'NR>1{for(i=1;i<=NF;i++){ if((i%4)==0) printf "\n"; printf "%s%s",$i,FS;}printf "\n"} END{printf "\n"}' input.csv
chr16 2697996 2697997 
chr16 2086192 2086193 
chr5 112801382 112801383 
chr5 138445682 138445683 
chr15 26869333 26869334 
chr8 119416385 119416386

Принятие "Столбцов" присутствует в файле, было бы легче обработать файл без них, следовательно NR>1 часть. После этого простой для цикла, который вставляет новую строку каждый раз, когда нет никакого остатка в целочисленном делении на 4 в номере столбца ( (i%4) == 0 часть). Это - очень общий прием для контакта с короткими счетчиками или данными, которые должны произойти в определенных интервалах. Новая строка необходима, потому что мы печатаем данные через printf непосредственно как простая строка, не сплошная линия.


Так как Вы запросили Python, вот сценарий Python также:

#!/usr/bin/env python3
import sys

with open(sys.argv[1]) as fd:
    for index,line in enumerate(fd):

        items=line.strip().split()
        if index == 0:
            print(" ".join(items[:len(items)//2]))
            continue

        left = items[:len(items)//2]
        right = items[len(items)//2:]
        print( " ".join(left) )
        print( " ".join(right) )

Работы следующим образом:

$ ./break_columns.py ./input.csv 
Column1 Column2 Column3
chr16 2697996 2697997
chr16 2086192 2086193
chr5 112801382 112801383
chr5 138445682 138445683
chr15 26869333 26869334
chr8 119416385 119416386
2
ответ дан 7 December 2019 в 13:22

Вы можете использовать Miller (https://github.com/johnkerl/miller) и скрипт bash. Начиная с ввода

Column1   Column2    Column3     Column4    Column5      Column6
chr16    2697996    2697997     chr16      2086192      2086193
chr5    112801382   112801383   chr5       138445682    138445683
chr15   26869333    26869334    chr8       119416385    119416386

и запуская

<input tail -n +2 | mlr --nidx --ifs ' ' --repifs cut -f 1,2,3 >out_01
<input tail -n +2 | mlr --nidx --ifs ' ' --repifs cut -f 4,5,6 >out_02

mlr --nidx --ifs ' ' --repifs cat out_01 out_02 >out

mlr -I --n2c --fs ' ' cat then label Column1,Column2,Column3 out

, у вас будет

Column1 Column2 Column3
chr16 2697996 2697997
chr5 112801382 112801383
chr15 26869333 26869334
chr16 2086192 2086193
chr5 138445682 138445683
chr8 119416385 119416386

Если вы хотите красиво распечатать вывод, измените последнюю команду в mlr -I --n2p --fs ' ' cat, затем пометьте Column1, Column2 ,Column3 out

Column1 Column2   Column3
chr16   2697996   2697997
chr5    112801382 112801383
chr15   26869333  26869334
chr16   2086192   2086193
chr5    138445682 138445683
chr8    119416385 119416386
0
ответ дан 6 September 2020 в 08:31

Другие вопросы по тегам:

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