Разделение CSV-файла на несколько файлов с 2 столбцами в каждом файле - PullRequest
0 голосов
/ 15 января 2019

Я пытаюсь разбить файл (testfile.csv), который содержит следующее:

1,2,4,5,6,7,8,9  
a,b,c,d,e,f,g,h  
q,w,e,r,t,y,u,i  
a,s,d,f,g,h,j,k  
z,x,c,v,b,n,m,z  

в файл

1,2  
a,b  
q,w  
a,s  
z,x  

и другой файл

4,5    
c,d    
e,r    
d,f    
c,v    

но я не могу сделать это в awk, используя итеративное решение.

awk -F, '{print $1, $2}'  
awk -F, '{print $3, $4}' 

делает это для меня, но я бы хотел зацикленное решение.

Я пытался

awk -F, '{ for (i=1;i< NF;i+=2) print $i, $(i+1) }' testfile.csv 

но это дает мне один столбец. Похоже, что я перебираю первую строку, а затем перехожу ко второй строке, пропуская все остальные элементы этой конкретной строки.

Ответы [ 4 ]

0 голосов
/ 16 января 2019

с седом:

sed -r '
ч
s /(.,.),. / \ 1 / w file1.txt
г
s /.,.,(.,.),.
/ \ 1 / w file2.txt 'file.txt

0 голосов
/ 15 января 2019

В bash это выполнимо, но будет намного медленнее, чем awk:

f=testfile.csv
IFS=, read -ra first < <(head -1 "$f")
for ((i = 0; i < (${#first[@]} + 1) / 2; i++)); do
    slice_file="${f%.csv}$((i+1)).csv"
    cut -d, -f"$((2 * i + 1))-$((2 * (i + 1)))" "$f" > "$slice_file"
done
0 голосов
/ 15 января 2019

Вы можете использовать cut:

$ cut -d, -f1,2 file > file_1
$ cut -d, -f3,4 file > file_2

Если вы собираетесь использовать awk, обязательно установите OFS, чтобы столбцы оставались CSV-файлом:

$ awk 'BEGIN{FS=OFS=","}
       {print $1,$2 >"f1"; print $3,$4 > "f2"}' file

$ cat f1
1,2
a,b
q,w
a,s
z,x
$cat f2 
4,5
c,d
e,r
d,f
c,v

Существует ли быстрый и грязный способ переименования результирующих файлов с первой строкой и первым столбцом (например, первый файл будет 1.csv, второй файл будет 4.csv :

awk 'BEGIN{FS=OFS=","}
     FNR==1 {n1=$1 ".csv"; n2=$3 ".csv"}
     {print $1,$2 >n1; print $3,$4 > n2}' file
0 голосов
/ 15 января 2019
awk -F, '{ for (i=1; i < NF; i+=2) print $i, $(i+1) > i ".csv"}' tes.csv

работает на меня. Я пытался получить вывод в bash, который был перепутан.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...