Text-Processing

AWK:連接來自不同記錄的欄位

  • March 31, 2022

給定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。真的有這樣的方法嗎?

-onlysed版本:

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 重複相同的值_。如果這不是您想要的,請更新您的問題以闡明您對該案例的要求。

引用自:https://unix.stackexchange.com/questions/695874