У меня есть файл 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
Вот подход 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
Вот подход 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
Вот подход 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
Вот подход 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