将csv文件拆分为多个文件,每个文件有2列

zaf*_*zaf 1 bash awk

我正在尝试拆分包含以下内容的文件 (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  
Run Code Online (Sandbox Code Playgroud)

成文件

1,2  
a,b  
q,w  
a,s  
z,x  
Run Code Online (Sandbox Code Playgroud)

和另一个文件

4,5    
c,d    
e,r    
d,f    
c,v    
Run Code Online (Sandbox Code Playgroud)

但我似乎无法使用迭代解决方案在 awk 中做到这一点。

awk -F, '{print $1, $2}'  
awk -F, '{print $3, $4}' 
Run Code Online (Sandbox Code Playgroud)

为我做,但我想要一个循环解决方案。

我试过

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

但它给了我一列。看来我正在迭代第一行,然后跳过该特定行的所有其他元素移动到第二行。

daw*_*awg 5

您可以使用cut

$ cut -d, -f1,2 file > file_1
$ cut -d, -f3,4 file > file_2
Run Code Online (Sandbox Code Playgroud)

如果您要使用,请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
Run Code Online (Sandbox Code Playgroud)

是否有一种快速而肮脏的方法来重命名带有第一行和第一列的结果文件(例如第一个文件是 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
Run Code Online (Sandbox Code Playgroud)