linux AWK列匹配模式

7bsow1i6  于 2022-12-22  发布在  Linux
关注(0)|答案(6)|浏览(186)

我正在尝试编写一个命令来查找csv文件中与模式匹配的特定列所在的行。我正在努力进行该列的模式匹配
任务:打印第5列(第5列日期)为2022年6月、7月或8月的行
示例csv文件:
| 列1|列2|第3栏|第4栏|列5日期|第6列|
| - ------|- ------|- ------|- ------|- ------|- ------|
| ABCD的|asdd语言|小行星2022| asdd语言|2022年7月4日|一些东西|
| ABCD的|asdd语言|小行星2022| asdd语言|2022年9月10日|一些东西|
| ABCD的|asdd语言|小行星2022| asdd语言|2020年12月12日|一些东西|
| ABCD的|asdd语言|小行星2020| asdd语言|9/1/19|一些东西|
| ABCD的|asdd语言|小行星2020| asdd语言|9/1/22|一些东西|
| ABCD的|asdd语言|小行星2021| asdd语言|2019年9月22日|一些东西|
| ABCD的|asdd语言|小行星2021| asdd语言|2022年2月16日|一些东西|
| ABCD的|asdd语言|小行星2021| asdd语言|6月16日22日|一些东西|
命令后的预期输出:第一行和最后一行是六月和七月。
我的awk命令:

cat file | awk -F'|' '$5 ~ /(6|7|8)\/*\/22$/'

在模式"/(6|7|8)\/*\/22$/"中我想说的是
m/d/Y - m为6、7或8

    • 一天
      22$ -用于年度和列末
vwkv1x7d

vwkv1x7d1#

我会用类似于

awk -F, '$5 ~ "^[6-8]/[^/]+/22$"'

这样就不必转义'/',而且还可以拒绝格式不正确日期

d4so4syb

d4so4syb2#

像这样,假设文件是csv(逗号),而不是tsv(制表符),甚至|(管道)分隔文件:

awk -F, '$5 ~ /^(6|7|8)\/.*\/22$/' file

但在示例输入中没有匹配的行

oxcyiej7

oxcyiej73#

模式\/*的这一部分重复0+次正斜杠,而不是匹配日期。
您可以将days部分的匹配范围缩小到数字(仍然无法验证有效日期),并且可以省略cat命令。

awk -F'|' '$5 ~ /^[678]\/([1-9]|[12][0-9]|3[01])\/22$/' file

如果使用逗号作为分隔符,则使用awk -F,

    • 产出**
abcd|asdd|2022|asdd|7/4/22|something
abcd|asdd|2021|asdd|6/16/22|something
9njqaruj

9njqaruj4#

假设数据格式正确,则可以消除格式匹配。

$ awk -F, '$5~/^[6-8].*22$/' file
xdnvmnnf

xdnvmnnf5#

与您显示的样本和尝试,请尝试以下awk代码。这里是完整的Online Demo使用正则表达式的解释。代码在这里匹配六月的确切日期范围(因为它的日期不能超过30),同样的事情与七月和八月,它将匹配日期范围,直到31只为这些月份的行。

awk '$5~/^6\/([1-9]|1[0-9]|2[0-9]|30)\/[0-9]{2}$|^[7-8]\/([1-9]|1[0-9]|2[0-9]|3[0-1])\/[0-9]{2}$/'  Input_file
klh5stk1

klh5stk16#

我不清楚输入文件是如何分隔的,所以为了演示的目的,我假设是逗号分隔的:

$ cat file
col1,col2,col3,col4,col5date,col6
abcd,asdd,2022,asdd,7/4/22,something
abcd,asdd,2022,asdd,10/9/22,something
abcd,asdd,2022,asdd,12/12/20,something
abcd,asdd,2020,asdd,9/1/19,something
abcd,asdd,2020,asdd,9/1/22,something
abcd,asdd,2021,asdd,9/22/19,something
abcd,asdd,2021,asdd,2/16/22,something
abcd,asdd,2021,asdd,6/16/22,something

一个awk创意:

awk -F',' -v mon='6,7,8' -v year="22" '        # define input delimiter as comma; OP provides comma-delimited list of numerical months along with desired year

BEGIN  { split(mon,a,",")                      # split input variable "mon" on commas and place results into array a[]
         for (i in a)                          # loop through indices of array a[] and ...
             months[a[i]]                      # build new array where numerical months are the indices of the array months[]
       }
FNR==1 { print; next }                         # print header row then skip to next line of input
       { split($5,a,"/")                       # split 5th field on "/" delimiter and place results into array a[]
         if (a[1] in months && a[3] == year)   # if a[1] is an index in the months[] array and a[3] matches the desired year then ...
            print                              # print current line to stdout
       }
' file

这将产生:

$ . ./dates.awk
col1,col2,col3,col4,col5date,col6
abcd,asdd,2022,asdd,7/4/22,something
abcd,asdd,2021,asdd,6/16/22,something

相关问题