Я имею к файлу 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
Вот 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
Вы можете использовать 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