Чтобы манипулировать 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 ответ
Вот 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, который вставляет символ новой строки всякий раз, когда нет остатка в целочисленном делении на 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 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