【问题标题】:Awk outputs two fields into a CSV file, but CSV file places both fields in the same cellawk 将两个字段输出到一个 CSV 文件中,但是 CSV 文件将两个字段放在同一个单元格中
【发布时间】:2018-10-17 13:56:57
【问题描述】:

这是Awk: “Current time” outputs as zero的后续问题

我正在尝试将 file1 中的第一个字段和当前时间作为两个单独的字段发送到 .CSV 文件中,以便 field1 将填充与 field2 不同的单元格。

例如在文件一中。一行看起来像这样:

IN-X_4096_20140802_121306_007 `random text`

[edit:] 在 file1 的这一特定行中,007 结束第一个字段,“随机文本”表示该行中出现许多字段以及上述第一个字段。

[edit:] 我希望字段 1 取自 file1 并成为 file2.CSV 中的一个单元格。因此,file2.csv 中的第 1 列将始终是文件 1 中的字段 1。棘手的部分似乎是使 file2.csv 中的第 2 列包含时间。

N-X_4096_20140802_121306_007 (cell in column A) 14:24:32 (cell in column B)

我使用的代码是:

awk -v OFS=, '{ print $1 strftime(" %r")}' file1.jump > file2.csv

目前,此代码导致.CSV 文件将整个输出放入file2.csv 中每一行的一个单元格中。有没有办法让输出进入.CSV 中的单独单元格?

【问题讨论】:

  • 对不起,问题不是很清楚。你能给出一个清晰的例子来说明你的输入是什么,它应该是什么样子?例如。文件 1 有像“A B C D”这样的行,我希望它的输出像“A,14:24:32,B,C,D”或类似的东西。
  • 把问题原子化也很好!继续努力!
  • $1 strftime(" %r")更改为$1, strftime("%r")
  • @ZakS EdMorton 的解决方案正确吗?
  • 亲爱的@EdMorton——它有效,谢谢。我是否正确理解,因为 OF​​S=,将字段运算符设置为“,” - 因此它输出为两个单独的字段?

标签: csv awk


【解决方案1】:

从您的 cmets 看来,您的实际问题是:

print 语句如何工作以及它如何受变量 OFS 的影响。

首先,重要的是要认识到 最重要的两个概念是记录字段

通过各种方式(stdingetline)输入 awk 的输入由 record 读取 record,其中每条记录由记录分隔符分隔由RS 定义。由于RS 默认情况下是 字符\n,因此记录实际上是一行,因此 awk 会逐行处理默认文件。

读取记录/行时,awk 会将记录拆分为字段,其中每个字段由字段分隔符FS(可以是正则表达式)分隔。默认情况下,字段分隔符FS 设置为任意 字符序列。这意味着,默认情况下,每个字段都是一个单词。如果重新定义FS,字段会有所不同。例如。

Mooo, that sexy cow!

默认有 4 个字段($1="Mooo,"$2="that""$3="sexy"$4="cow!")但如果 FS="," 它只有 2 个字段($1="Mooo"$2=" that sexy cow!"

以上都是关于输入以及 awk 如何理解它的,但在输出中,记录字段的概念也是众所周知的。这就是print 语句的用武之地。print 语句允许您打印由各种字段构建的记录。输出记录分隔符ORS,默认为 字符\n,告诉您如何分隔两条记录,输出字段分隔符OFS,默认为 ,告诉您字段如何分隔是分开的。打印语句看起来像

print arg1, arg2, ..., argn

并将打印一条记录,其中包含由OFS 分隔并以ORS 结尾的n 字段。

打印语句应将每个表达式参数的值写入由当前输出字段分隔符分隔的指示输出流(参见上面的变量OFS),并由输出记录分隔符终止(参见上面的变量ORS) .所有表达式参数都应作为字符串,必要时进行转换;此转换应如 awk 中的表达式中所述,但应使用 OFMT 中的 printf 格式而不是 CONVFMT 中的值。一个空的表达式列表应代表整个输入记录 ($0)。

来源:POSIX Awk

所以现在回答这个问题。您的原始行内容为:

awk -v OFS=, '{ print $1 strftime(" %r")}' file1.jump > file2.csv

这里 OFS 没有效果,因为 print 只有一个参数,读取 $1 strftime(" %r") (请注意,$1strftime 之间的空格没有意义,可以忽略,所以两个字符串连接起来。所以你想要的是这个:

awk -v OFS=, '{ print $1, strftime("%r")}' file1.jump > file2.csv

原始(错误)答案

我相信你所追求的是:

所以你可以这样做,

awk '{ print $1,strftime(" %r")}' file | paste -s -d',' > file2

或者如果它只是 awk,

awk '{ printf (NR==1?"":",") $1 OFS strftime(" %r") }' file > file2

【讨论】:

    猜你喜欢
    • 2016-06-23
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    • 1970-01-01
    • 2019-08-25
    • 2020-05-05
    • 2017-12-27
    • 1970-01-01
    相关资源
    最近更新 更多