我再次需要您的專業知識,我正在嘗試使用 awk 做一些有條件的操作來獲取列。
如果我查看$5資料可以有year,并且在某些地方有date.
所以什么時候year可以列印,但是我date and time喜歡的其他值05:17:27我需要列印最后一個欄位。
2021
2021
05:17:27
20:33:17
05:17:20
2020
2020
2021
2020
2021
以下是我的示例資料。
資料檔案。
yogutdb01 Mon 28 Jun 2021 11:19:56 PM MST
yogutdb02 Thu 30 Sep 2021 02:02:53 AM MST
yogutdb03 Thu Jul 13 05:17:27 2017
yogutdb04 Fri Jun 23 20:33:17 2017
yogutdb05 Thu Jul 13 05:17:20 2017
yogutdb06 Wed 24 Jun 2020 03:49:16 PM MST
yogutdb07 Wed 24 Jun 2020 04:05:10 PM MST
yogutdb08 Sat 22 May 2021 04:19:14 AM MST
yogutdb09 Thu 09 Apr 2020 12:16:32 PM CEST
yogutdb10 Tue 11 May 2021 03:03:02 PM MST
我的試驗:我在下面使用,但在else條件上出現語法錯誤。
$ awk '{ ($5=="[^0-9] $")print $1,$2,$3,$4,$5; else print $1,$2,$3,$4,$NF}' my_data.text
期望應該是:
yogutdb01 2021
yogutdb02 2021
yogutdb03 2017
yogutdb04 2017
yogutdb05 2017
yogutdb06 2020
yogutdb07 2020
yogutdb08 2021
yogutdb09 2020
yogutdb10 2021
或者
yogutdb01 Mon 28 Jun 2021
yogutdb02 Thu 30 Sep 2021
yogutdb03 Thu Jul 13 2017
yogutdb04 Fri Jun 23 2017
yogutdb05 Thu Jul 13 2017
yogutdb06 Wed 24 Jun 2020
yogutdb07 Wed 24 Jun 2020
yogutdb08 Sat 22 May 2021
yogutdb09 Thu 09 Apr 2020
yogutdb10 Tue 11 May 2021
uj5u.com熱心網友回復:
- 您不能使用
==運算子來測驗正則運算式匹配。相反,您可以使用match()函式或~運算子。 - 您應該將
^正則運算式放在前面[0-9],而不是里面。
那你試試:
awk '{if (match($5,/^[0-9] $/)) print $1, $2, $3, $4, $5; else print $1, $2, $3, $4, $NF}' my_data.text
輸出:
yogutdb01 Mon 28 Jun 2021
yogutdb02 Thu 30 Sep 2021
yogutdb03 Thu Jul 13 2017
yogutdb04 Fri Jun 23 2017
yogutdb05 Thu Jul 13 2017
yogutdb06 Wed 24 Jun 2020
yogutdb07 Wed 24 Jun 2020
yogutdb08 Sat 22 May 2021
yogutdb09 Thu 09 Apr 2020
yogutdb10 Tue 11 May 2021
這是使用~運算子的替代方法:
awk '$5 ~ /^[0-9] $/ {print $1, $2, $3, $4, $5; next} {print $1, $2, $3, $4, $NF}' my_data.text
uj5u.com熱心網友回復:
根據您想要的結果,您應該嘗試以下哪種方法可行。
您可以使用正則運算式匹配,例如~.
$ awk '{ if ($5 !~ /:/) { print $1,$2,$3,$4,$5; next } { print $1,$2,$3,$4, $NF } }' exampl_data1
結果:
yogutdb01 Mon 28 Jun 2021
yogutdb02 Thu 30 Sep 2021
yogutdb03 Thu Jul 13 2017
yogutdb04 Fri Jun 23 2017
yogutdb05 Thu Jul 13 2017
yogutdb06 Wed 24 Jun 2020
yogutdb07 Wed 24 Jun 2020
yogutdb08 Sat 22 May 2021
yogutdb09 Thu 09 Apr 2020
yogutdb10 Tue 11 May 2021
順便提一下,正如@tshiono 在評論中還問的那樣,要按順序獲取輸出,您可以在下面使用。
$ awk '{ if ($5 !~ /:/) { print $1, $2, $3, $4, $5; next } { print $1, $2, $4, $3, $NF } }' exampl_data1
uj5u.com熱心網友回復:
您可以列印前 4 個欄位,并僅檢查第 5 個欄位的 4 位數字。如果不是只有 4 位數字,則列印最后一個欄位。
awk '{print $1, $2, $3, $4, ($5 ~ /^[0-9] $/ ? $5 : $NF)}' my_data.text
輸出
yogutdb01 Mon 28 Jun 2021
yogutdb02 Thu 30 Sep 2021
yogutdb03 Thu Jul 13 2017
yogutdb04 Fri Jun 23 2017
yogutdb05 Thu Jul 13 2017
yogutdb06 Wed 24 Jun 2020
yogutdb07 Wed 24 Jun 2020
yogutdb08 Sat 22 May 2021
yogutdb09 Thu 09 Apr 2020
yogutdb10 Tue 11 May 2021
uj5u.com熱心網友回復:
更新:新版本還修復了第 3 列和第 4 列中的月份-日期交叉放置:
echo "${aaaaa}" \
\
| mawk 'NF=_ !($_=$(! $NF?_:NF))*($3=$(2 2^(\
__= $4 ~ /^[0-3][0-9]$/)) \
substr("",$4=$(4-__)))' \_=5
yogutdb01 Mon 28 Jun 2021
yogutdb02 Thu 30 Sep 2021
yogutdb03 Thu 13 Jul 2017 *** fixed these 3 rows
yogutdb04 Fri 23 Jun 2017 ***
yogutdb05 Thu 13 Jul 2017 ***
yogutdb06 Wed 24 Jun 2020
yogutdb07 Wed 24 Jun 2020
yogutdb08 Sat 22 May 2021
yogutdb09 Thu 09 Apr 2020
yogutdb10 Tue 11 May 2021
第一個假設在$NF4 位數年份以外沒有任何數字資料
第二個選項執行更徹底的年份資料檢查。兩者都涉及將正確的年份值分配給$5,然后使用分配NF來修剪其右側所有多余的列/欄位。
< datafile.txt \
\
| mawk 'NF=_^($_=$(! $NF?_:NF))^!_' \_=5
or
| mawk 'NF= _ ($_=$(/[ ][012][0-9][0-9][0-9]$/? NF :_))*!_' \_=5
| gawk 'NF= _ !($_=$(/[ ][0-2][0-9]{3}$/ ? NF :_))' \_=5
yogutdb01 Mon 28 Jun 2021
yogutdb02 Thu 30 Sep 2021
yogutdb03 Thu Jul 13 2017
yogutdb04 Fri Jun 23 2017
yogutdb05 Thu Jul 13 2017
yogutdb06 Wed 24 Jun 2020
yogutdb07 Wed 24 Jun 2020
yogutdb08 Sat 22 May 2021
yogutdb09 Thu 09 Apr 2020
yogutdb10 Tue 11 May 2021
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/460399.html
上一篇:else陳述句在反應中被忽略
