Чтобы манипулировать csv-файлом с помощью скрипта bash или python, преобразование определенных строк в столбец

У меня есть файл csv с 6 столбцами, я хочу написать скрипт с использованием python или bash, чтобы я мог сгенерировать новый файл, может быть 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

4 ответа

Вот подход 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. После этого это простой цикл for, который вставляет новую строку всякий раз, когда в столбце номер (часть (i%4) == 0 нет остатка в целочисленном делении на 4). Это очень распространенный трюк для обработки коротких счетчиков или данных, которые должны выполняться через определенные промежутки времени. Новая строка необходима, потому что мы печатаем данные через 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
ответ дан 18 July 2018 в 17:23

Вот подход 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. После этого это простой цикл for, который вставляет новую строку всякий раз, когда в столбце номер (часть (i%4) == 0 нет остатка в целочисленном делении на 4). Это очень распространенный трюк для обработки коротких счетчиков или данных, которые должны выполняться через определенные промежутки времени. Новая строка необходима, потому что мы печатаем данные через 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
ответ дан 20 July 2018 в 16:56

Вот подход 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. После этого это простой цикл for, который вставляет новую строку всякий раз, когда в столбце номер (часть (i%4) == 0 нет остатка в целочисленном делении на 4). Это очень распространенный трюк для обработки коротких счетчиков или данных, которые должны выполняться через определенные промежутки времени. Новая строка необходима, потому что мы печатаем данные через 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
ответ дан 23 July 2018 в 10:11

Вот подход 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. После этого это простой цикл for, который вставляет новую строку всякий раз, когда в столбце номер (часть (i%4) == 0 нет остатка в целочисленном делении на 4). Это очень распространенный трюк для обработки коротких счетчиков или данных, которые должны выполняться через определенные промежутки времени. Новая строка необходима, потому что мы печатаем данные через 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
ответ дан 31 July 2018 в 17:06
  • 1
    Это сработало: D Большое спасибо – Ankita Srivastava 17 July 2018 в 08:39
  • 2
    Всегда пожалуйста :) – Sergiy Kolodyazhnyy 17 July 2018 в 08:42
  • 3
    @AnkitaSrivastava См. Обновление ответа. – Sergiy Kolodyazhnyy 17 July 2018 в 09:19
  • 4
    Большое спасибо за оба :) – Ankita Srivastava 17 July 2018 в 12:39
  • 5
    Эй, я получил ответ. Да, для этого уже был вопрос. :) Я использую paste -d & quot; & Quot; - - & lt; имя файла – Ankita Srivastava 24 July 2018 в 08:01

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

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