【问题标题】:Awk add a variable to part of a column stringawk 将变量添加到列字符串的一部分
【发布时间】:2020-03-20 15:24:06
【问题描述】:

目标

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

文件1.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 中的工作方式,但我无法在这一行中找到处理它的方法。有谁知道这是否可行,或者我是否需要创建一个新行来实现这一点?

【问题讨论】:

  • 很好,您已经展示了您尝试解决问题的方法。如果您更清楚地解释您在描述类型(问题的详细描述)中寻找的内容,那么我们将更好地理解问题,我们可能会提供更好的帮助,请在您的问题中添加更多信息并让我们知道。跨度>
  • 也得到了像你必须阅读多个 csv 文件然后你正在考虑日期差异但问题是应该是什么逻辑来获得你的预期输出?您是否正在寻找将输出保存到 Input_file 本身?
  • @RavinderSingh13 抱歉,我意识到我有点混淆了数据集。我已经更新了帖子以包括;正确的数据,我得到什么,我想要得到什么——以及更详细的解释。让我知道现在是否有意义或是否仍不清楚?

标签: shell csv awk


【解决方案1】:

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

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

在repl 中使用提供的输入进行测试。

for f in $(find *.csv)

find没用,没意义,只是

for f in *.csv

另请注意,您正在循环的当前目录中创建 1_$f.csv、2_$f.csv 和 3_$f.csv 文件,因此下次运行脚本时,将有 4 倍以上的 .csv 文件进行迭代。不知道这是否相关。

$iv 在 awk 中如何工作?

$<number> 是 awk 行中的字段编号 <number>。例如,$1 是 awk 中该行的第一个字段。 $2 是第二个字段。 $0 很特别,是整行。

$iv 扩展为 $ + iv 的值。比如:

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

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

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

【讨论】:

  • 您的示例在OFS=',' 中显示, 的语法错误。看来我必须删除它才能运行代码,但这样做会导致我的行合并并生成以下示例BOB-UK-67 display,dc,client,20572431,5383594 0.05。 OFS 被拒绝是否有原因,因为似乎需要它才能将我的列保持在正确的位置并防止合并。
  • 您是否按照介绍的方式完全复制?包括所有"?谁“吐出语法错误”? bash 或 awk(或其他工具)? “语法错误”消息到底是什么样的?请具体,不要描述发生了什么,展示发生了什么。
  • @El_Birdo 发布的脚本中没有语法错误,您要么复制/粘贴不正确,要么在您的 shell 脚本的其他地方存在语法错误(例如,缺少终止引号)。通过shellcheck.net运行它。
  • 抱歉,您的代码有效。该错误似乎来自我的脚本的附加部分(帖子中未提及),我认为这不会影响它。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2017-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-25
  • 2017-04-03
  • 1970-01-01
  • 2021-12-21
相关资源
最近更新 更多