Awk将两个字段输出到CSV文件中,但是CSV文件将两个字段都放在同一单元格中

时间:2018-10-17 13:56:57

标签: csv awk

这是对Awk: “Current time” outputs as zero

的跟进问题

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

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

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 个答案:

答案 0 :(得分:1)

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

  

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

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

通过 record 读取通过各种方式(stdingetline)输入到awk的输入 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} }和$1="Mooo"

以上内容不仅涉及输入以及awk对其的理解方式,而且在输出中还了解了 records fields 的概念。这就是$2=" that sexy cow!"语句的来源。print语句使您可以打印由各种字段构成的记录。输出记录分隔符print(默认情况下为字符ORS)告诉您如何分隔两个记录,输出字段分隔符\n(缺省情况下为 {{1 }},告诉您如何分隔字段。打印语句看起来像

OFS

,将打印一条记录,其中个字段由print arg1, arg2, ..., argn 分隔,并以n结尾。

  

print语句应将每个表达式参数的值写入由当前输出字段分隔符(请参见上面的变量OFS)分隔的指示的输出流,并由输出记录分隔符(请参见变量{{1 }} 以上)。所有表达式自变量均应视为字符串,并在必要时进行转换;此转换应与awk中的表达式中所述相同,不同之处在于应使用ORS中的OFS格式代替ORS中的值。空表达式列表应代表整个输入记录(printf)。

     

来源:POSIX Awk

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

OFMT

此处CONVFMT无效,因为print只有一个读为$0的参数(请注意,awk -v OFS=, '{ print $1 strftime(" %r")}' file1.jump > file2.csv OFS之间的空格没有意义,可以忽略,所以两个字符串都是串联的。所以您想要的是这样:

$1 strftime(" %r")

原始(错误)答案

我相信您追求的是以下各项的组合:

所以您可以这样做

$1

或者如果仅仅是awk,

strftime