awk将变量添加到列字符串的一部分

埃尔·伯多

目的

在输出文件的第1列中添加“ 67”,其中67是根据两个日期之间的差分类的变量($ iv)。

File1.csv

display,dc,client,20572431,5383594
display,dc,client,20589101,4932821
display,dc,client,23030494,4795549
display,dc,client,22973424,5844194
display,dc,client,21489000,4251031
display,dc,client,23150347,3123945
display,dc,client,23194965,2503875
display,dc,client,20578983,1522448
display,dc,client,22243554,920166
display,dc,client,20572149,118865
display,dc,client,23077785,28077
display,dc,client,21811100,5439

当前输出3_file1.csv

BOB-UK-,display,dc,client,20572431,5383594,0.05,269.18
BOB-UK-,display,dc,client,20589101,4932821,0.05,246.641
BOB-UK-,display,dc,client,23030494,4795549,0.05,239.777
BOB-UK-,display,dc,client,22973424,5844194,0.05,292.21
BOB-UK-,display,dc,client,21489000,4251031,0.05,212.552
BOB-UK-,display,dc,client,23150347,3123945,0.05,156.197
BOB-UK-,display,dc,client,23194965,2503875,0.05,125.194
BOB-UK-,display,dc,client,20578983,1522448,0.05,76.1224
BOB-UK-,display,dc,client,22243554,920166,0.05,46.0083
BOB-UK-,display,dc,client,20572149,118865,0.05,5.94325
BOB-UK-,display,dc,client,23077785,28077,0.05,1.40385
BOB-UK-,display,dc,client,21811100,5439,0.05,0.27195
TOTAL,,,,,33430004,,1671.5

所需的输出3_file1.csv

BOB-UK-67,display,dc,client,20572431,5383594,0.05,269.18
BOB-UK-67,display,dc,client,20589101,4932821,0.05,246.641
BOB-UK-67,display,dc,client,23030494,4795549,0.05,239.777
BOB-UK-67,display,dc,client,22973424,5844194,0.05,292.21
BOB-UK-67,display,dc,client,21489000,4251031,0.05,212.552
BOB-UK-67,display,dc,client,23150347,3123945,0.05,156.197
BOB-UK-67,display,dc,client,23194965,2503875,0.05,125.194
BOB-UK-67,display,dc,client,20578983,1522448,0.05,76.1224
BOB-UK-67,display,dc,client,22243554,920166,0.05,46.0083
BOB-UK-67,display,dc,client,20572149,118865,0.05,5.94325
BOB-UK-67,display,dc,client,23077785,28077,0.05,1.40385
BOB-UK-67,display,dc,client,21811100,5439,0.05,0.27195
TOTAL,,,,,33430004,,1671.5

当前代码

#! bin/sh

set -eu

de=$(date +"%d-%m-%Y" -d "1 month ago")
ds="15-04-2014"
iv=$(awk -vdate1=$de -vdate2=$ds 'BEGIN{split(date1, A,"-");split(date2, B,"-");year_diff=A[3]-B[3];if(year_diff){months_diff=A[2] + 12 * year_diff - B[2] + 1;} else {months_diff=A[2]>B[2]?A[2]-B[2]+1:B[2]-A[2]+1};print months_diff}')



for f in $(find *.csv); do

    awk -F"," -v OFS=',' '{print "BOB-UK-"$iv,$0,0.05}' $f > "1_$f.csv" ##PROBLEM LINE##
    awk -F"," -v OFS=',' '{print $0,$6*$7/1000}' "1_$f.csv" > "2_$f.csv" ##calculate price
    awk -F"," -v OFS=',' '{print $0}; {sum+=$6}{sum2+=$8} END {print "TOTAL,,,,," (sum)",,"(sum2)}' "2_$f.csv" > "3_$f.csv" ##calculate total

done

问题

当我运行第一条awk行(标记为“ ## PROBLEM LINE ##”)时,循环不会更改列$ 1以在“ BOB-UK-”之后包含“ 67”。应该使用来完成此操作,print "BOB-UK-"$iv但是它什么也不做。我怀疑这是由于print工作方式引起的awk但我无法在此行中找到一种处理它的方法。有谁知道这是否可行,还是我需要创建一个新行来实现?

卡米尔库克

您必须将变量值传递给awkawk不会从shell继承变量,也不会$variable像shell那样扩展变量。它是内部语言的另一种工具。

awk -v iv="$iv" -F"," -v OFS=',' '{print "BOB-UK-"iv,$0,0.05}' "$f"

测试在REPL与提供的输入。

为$(查找* .csv)中的f

无用的find,没有道理,只是

for f in *.csv

还要注意,您正在创建1_$f.csv2_$f.csv并且3_$f.csv文件在循环的当前目录中,因此,下次运行脚本时,将遍历4倍多的.csv文件。邓诺,如果这是相关的。

$iv在awk中如何工作?

$<number>是场号<number>从在AWK的行。因此,例如$1awk是该行的第一个字段。$2是第二个字段。$0是特殊的,它是整条生产线。

$iv扩展为$+的价值iv因此,例如:

echo a b c | awk '{iv=2; print $iv}'

将输出b$iv扩展为,$2然后$2从输入扩展到第二个字段-即。b

中的未初始化变量使用awk进行初始化0所以在您的行中$iv被替换,因此它扩展了整行。$0awk

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

删除字符串的一部分

将轻击手势添加到UILabel的一部分

隔离字符串的一部分

Imacros将一部分添加到URL

Django-将字符串的一部分添加到新行中无法正常工作

将字符串的一部分转换为数据帧的不同列

在awk脚本中提取字符串的一部分

根据另一列(Python Pandas)的值在列中添加一部分字符串

如何使用REGEX提取字符串的一部分并将其添加到另一列,然后分组依据?

选择字符串的一部分

如何将字符串的一部分提取到变量中?

将列中的一部分字符串复制到MYSQL中的另一部分

将字符串的一部分追加到字典

替换字符串的一部分

将整数的一部分添加到bytearray

使用awk或gawk提取字符串的一部分

将变量打印为多行字符串的一部分?

将NSArray的一部分添加到其他NSArray

如何将Tkinter变量打印为字符串的一部分?

如何从文件名中提取字符串的一部分并将其添加到该文件中

将字符串的一部分绑定到Angular作用域变量

iOS:将IBAction添加到UILabel的一部分

将一个单元格中的字符串(的一部分)添加到同一系列中的另一个单元格中,然后遍历整个列

反转字符串的一部分

如何将 Python 字符串变量添加到 Python 中的 SQL 字符串变量的一部分?

将 onClick 添加到 RecyclerView 项目的一部分

将字符串的一部分放入变量中

将字符串的一部分从一列连接到另一列

使用 bash 或 awk 替換字符串的一部分