给定file
:
2018-03-22 foo/bar/baz
2020-09-30 Lorem/ipsum/dolor
2021-10-01 yadda/yadda/yadda
2022-03-14 blah/blah/blah
(实际文件包含数千行这样的行)
如何获取字符串2018-03-22_2022-03-14
?这是记录 1 中的字段 1 的串联,后跟下划线,然后是最后一条记录中的字段 1。
我想出了这个:
$ awk 'BEGIN{ORS="_"}NR==1{print $1} END{print $1}' file | sed 's/_$//'
2018-03-22_2022-03-14
它有效,但似乎应该有一种简单的方法来获得相同的结果 only awk
,或者可能 only sed
,没有管道或子shell。真的有这样的方法吗?
-only
sed
版本:s/ .*//
删除空格后的所有内容,仅保留日期1h
复制空间1
中的行日期hold
$!d
d
删除除最后一行之外的所有行H
与我们的第一个日期一起附加到旧空间,然后将两者复制到模式空间中g
y/\n/_/
(是的,它有点短)
为了可移植性,不要在该部分中执行
print $1
(或使用$anything
),因为该部分中的,等END
的值是每个 POSIX 未定义的行为。在该部分中的某些 awk中,将是读取的最后一行的第一个字段的值,在其他 awk 中它将为空,而在其他 awk 中,它可能是其他任何值。$0
$1
END
$1
END
在每个 Unix 机器上的任何 shell 中使用任何 awk:
_
或者如果输入文件为空,则避免打印单个:以上假设如果输入中只有 1 行,则您希望在它们之间
$1
使用 a 重复相同的值_
。如果这不是您想要的,请更新您的问题以阐明您对该案例的要求。一种完全的方法
awk
(尽管由于本节中的字段引用,@EdMorton 指出不严格符合 POSIXEND
)是将变量设置为记录 1 中字段 1 的值,然后在最后打印此变量_
和最后一条记录的字段 1:注意:我没有计划这是一个“问答”类型的问题,但是当我最初尝试提交Q时,SE 处于只读模式,在此期间我终于想出了一个A。我仍然希望看到其他答案,特别是如果它们在命令行上更短。
用于
printf
控制输出:我建议您将
head
andtail
用于大型输入文件,因为处理大型文件awk
的sed
速度很慢。这比您的命令长,但如果文件很大,它可能会更快:
如果文件实际上是制表符分隔的,则可以省略
-d' '
. 如果文件可能以 开头-
,或者$1
值可能包含反斜杠,可能更安全。
输出