这是对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
中的单独单元格中?
答案 0 :(得分:1)
从您的评论看来,您的实际问题是:
OFS
影响。
首先,重要的是要认识到awk的两个最重要的概念是记录和字段。
通过 record 读取通过各种方式(stdin
或getline
)输入到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
(缺省情况下为
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