Text-Processing
AWK:連接來自不同記錄的欄位
給定
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
,或者可能 onlysed
,沒有管道或子shell。真的有這樣的方法嗎?
-only
sed
版本:sed 's/ .*//;1h;$!d;H;g;y/\n/_/' file
- 用於
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:
$ awk -v OFS='_' 'NR==1{beg=$1} {end=$1} END{print beg, end}' file 2018-03-22_2022-03-14
_
或者如果輸入文件為空,則避免列印單個:awk -v OFS='_' 'NR==1{beg=$1} {end=$1} END{ if (NR) print beg, end}' file
以上假設如果輸入中只有 1 行,則您希望在它們之間
$1
使用 a 重複相同的值_
。如果這不是您想要的,請更新您的問題以闡明您對該案例的要求。