Bash выбрать допустимые строки из файла с помощью awk - PullRequest
2 голосов
/ 15 октября 2019

У меня большой набор данных с некоторыми недопустимыми строками. Я хочу скопировать в другой файл только те строки, которые начинаются с правильной даты (цифры регулярного выражения).

В основном проверьте, является ли 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 строк не отвечают моим потребностям, потому что мои недопустимые строки могут быть где угодно. Это решение по какой-то причине не работает.

Ответы [ 4 ]

3 голосов
/ 15 октября 2019

Поскольку у вас большой набор данных и такое простое требование, вы можете просто использовать для этого grep, поскольку это будет быстрее, чем awk:

grep '^[0-9]' file
3 голосов
/ 15 октября 2019

На основании ваших данных вы можете проверить, имеет ли первый столбец 8 цифр для представления даты в формате YYYYMMDD, с помощью этой команды:

awk '$1 ~ /^[0-9]{8}$/' file > output
1 голос
/ 16 октября 2019

Вы также можете попробовать это ..

sed '/^[0-9]/!d' inputfile > outputfile
1 голос
/ 15 октября 2019

Вы можете просто пойти с этим:

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

По умолчанию awk работает со строками, поэтому вы говорите ему ( Я предполагаю, что он мальчик ), чтобы выбратьСтроки, которые начинаются (^) хотя бы с одной цифры ([0-9]+), и распечатывать их, перенаправляя в output.txt.

Надежда помогает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...