我正在尝试拆分包含以下内容的文件(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
但是它只给我一列。看来我要遍历第一行,然后移到第二行,跳过该特定行的所有其他元素。
答案 0 :(得分:4)
awk -F, '{ for (i=1; i < NF; i+=2) print $i, $(i+1) > i ".csv"}' tes.csv
为我工作。我正试图将bash的输出弄乱了。
答案 1 :(得分:4)
您可以使用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
答案 2 :(得分:1)
它可以在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
答案 3 :(得分:0)
带有sed:
sed -r'
h
s /(。,。),。 / \ 1 / w file1.txt
g
s /.,.,(...),. / \ 1 / w file2.txt'file.txt