Bash 使用 awk 从文件中选择有效行



我有一个大数据集,其中包含一些无效行。我只想以有效日期(正则表达式数字(开头的行复制到另一个文件。

基本上检查awk $1是否是数字([0-9](,如果是,则写入整行($0(输出文件,如果没有跳过这一行,则转到下一行。

我怎么想象(两个版本都给出语法错误(:

awk '{if ($1 =~ [0-9]) print $0 }' >> output.txt
awk '$1 =~ [0-9] {print $0}' filename.txt

虽然这确实打印了第一个字段,但我不知道如何进行。

awk '{ print $1 }' filename.txt
19780101
19780102
19780103
a
19780104
19780105
19780106
...

完整数据集:

19780101    1   1   1   1   1
19780102    2   2   2   2   2
19780103    3   3   3   3   3
a   a   a   a   a   a
19780104    4   4   4   4   4
19780105    5   5   5   5   5
19780106    6   6   6   6   6
19780107    7   7   7   7   7
19780108    8   8   8   8   8
19780109    9   9   9   9   9
19780110    10  10  10  10  10
19780111    11  11  11  11  11
19780112    12  12  12  12  12
19780113    13  13  13  13  13
19780114    14  14  14  14  14
19780115    15  15  15  15  15
19780116    16  16  16  16  16
a   a   a   a   a   a
19780117    17  17  17  17  17
19780118    18  18  18  18  18
19780119    19  19  19  19  19
19780120    20  20  20  20  20

可以使用R 重现数据集

library(dplyr)
library(DataCombine)
N  <- 20
df = as.data.frame(matrix(seq(N),nrow=N,ncol=5))
df$date = format(seq.Date(as.Date('1978-01-01'), by = 'day', len = N), "%Y%m%d")
df <- df %>% select(date, everything())
df <- InsertRow(df, NewRow = rep("a", 6), RowNum = 4)
df <- InsertRow(df, NewRow = rep("a", 6), RowNum = 18)
write.table(df,"filename.txt", quote = FALSE, sep="t",row.names=FALSE)

有关读取前 N 行的问题不能满足我的需求,因为我的无效行可能在任何地方。由于某种原因,此解决方案不起作用。

由于您有一个大型数据集和如此简单的要求,因此您可以使用 grep,因为它比 awk 更快:

grep '^[0-9]' file

根据您的数据,您可以使用以下命令检查第一列是否有 8 位数字来表示YYYYMMDD格式的日期:

awk '$1 ~ /^[0-9]{8}$/' file > output

你可以这样做:

awk '/^[0-9]+/' file.txt  >> output.txt

默认情况下,awk使用行,所以你告诉他(我假设他是一个男孩(选择以至少一个数字([0-9]+(开头(^(的行,并打印它们,重定向output.txt

希望有帮助。

你也可以试试这个。

sed '/^[0-9]/!d' inputfile > outputfile

最新更新