我有一个大文件(~10GB),我想复制该文件10次,但每次都要向第一列添加一个变量:
for i in (1, 10):
var = (i-1) * 1000
# add var to the first column of the file and save the file as file(i).csv
到目前为止,我已经尝试过:
#!/bin/bash
for i in {1..10}
do
t=1
j=$(( $i - t ))
s=1000
person_id=$(( j * add ))
awk -F"," 'BEGIN{OFS=","} NR>1{$1=$1+$person_id} {print $0}' file.csv > file$i.csv
done
但列值没有变化。
答案 0 :(得分:2)
Awk变量与shell变量不同。
替换:
awk -F"," 'BEGIN{OFS=","} NR>1{$1=$1+$person_id} {print $0}' file.csv > file$i.csv
使用:
awk -F"," -v id="$person_id" 'BEGIN{OFS=","} NR>1{$1=$1+id} {print $0}' file.csv > "file$i.csv"
这使用-v
选项定义awk变量id
,其值为shell变量person_id
的值。
由于,
不是shell活动字符,因此可以简化代码。此外,更改OFS
定义的位置可以进一步缩短代码:
awk -F, -v id="$person_id" 'NR>1{$1+=id} 1' OFS=, file.csv > "file$i.csv"
最后,我们用隐秘的速记{print $0}
替换了1
。 (这是因为awk将1
解释为一个逻辑条件,它将其计算为true,并且由于没有提供任何操作,awk将执行默认操作,即打印该行。)