仅删除某些文件的前10行

时间:2019-08-31 14:32:18

标签: python r bash

我目前正在分析管道输出中给出的文件。我正在使用结构如下的CSV文件:

sample,acc,count
https//:url0.com,LS4456,10
https//:url1.com,LS4465,15

问题是某些文件(实际上很多文件)在找不到某个文件时的管道在csv格式化的部分之前放置了十行作为日志:

some useless log information... 1
some useless log information... 2
some useless log information... 3
some useless log information... 4
some useless log information... 5
some useless log information... 6
some useless log information... 7
some useless log information... 8
some useless log information... 9
sample,acc,count
https//:url0.com,LS4456,10
https//:url1.com,LS4465,15

我有274个文件,其中有些包含日志部分,有些则没有。有没有一种有效的方法可以使用R,python或bash删除带有日志部分的文件的前10行?

基本思想是: 打开文件; 如果第一个单词不是“ sample”,然后删除前9行

5 个答案:

答案 0 :(得分:2)

尝试一下。它会删除其中包含“ some”一词的所有记录。

# Create dataframe
df <- data.frame(
  x1 = c(
    'some useless log information... 1',
    'some useless log information... 2',
    'some useless log information... 3',
    'some useless log information... 4',
    'some useless log information... 5',
    'some useless log information... 6',
    'some useless log information... 7',
    'some useless log information... 8',
    'some useless log information... 9',
    'sample,acc,count',
    'https//:url0.com,LS4456,10',
    'https//:url1.com,LS4465,15'
      ))

# Keep only records that do not contain 'some'
df <- subset(df, regexpr(pattern ='some',df$x1) == -1)

答案 1 :(得分:2)

1)fread 使用我们在Note末尾可重复生成的文件Minardi.csv,使用data.table fread函数,该函数接受{{1} },以便跳过该字符串首次出现之前的所有行。如果可以返回data.table,请忽略skip参数。

data.table=FALSE

给予:

library(data.table)
fread("Minardi.csv", skip = "sample", data.table = FALSE)

1a):如果垃圾行不包含任何逗号,则此替代方法也适用:

            sample    acc count
1 https//:url0.com LS4456    10
2 https//:url1.com LS4465    15

2)基本R 基本R解决方案是:

fread("Minardi.csv", sep = ",", data.table = FALSE)

2a):如果垃圾行中不包含逗号,则这也有效:

read.csv("Minardi.csv", as.is = TRUE,
   skip = if (grepl("sample", readLines("Minardi.csv", 1))) 0 else 9)

注意

# Windows
read.csv(pipe("findstr , Minardi.csv"), as.is = TRUE)

# Linux
read.csv(pipe("grep , Minardi.csv"), as.is = TRUE)

答案 2 :(得分:1)

您可以使用os.walk()获取目录中除子目录外的所有文件的列表。要从文件中删除第一行,应重写它。这就是为什么我们首先使用file.readlines()将文件内容读入列表的原因。然后,我们使用file.writelines()切片的列表写入文件。我们找到从"sample"开始的第一行的索引,并从此行中查找切片源列表。如果您确定它将始终为9行,则可以将其替换为f.writelines(lines[10:])

代码:

import os

path, _, files = next(os.walk("./sample"))
for fn in files:
    with open(os.path.join(path, fn)) as f:
        lines = f.readlines()
    with open(os.path.join(path, fn), "w") as f:
        f.writelines(lines[next(i for i, line in enumerate(lines) if line.startswith("sample")):])

答案 3 :(得分:1)

使用R,您可以首先获取所有文件的路径

all_files <- list.files("/path/of/the/files", full.names = TRUE)

查看它们,用header = FALSE读取每个文件,检查第一个单元格是否包含单词"sample"。如果确实如此,则删除前9行并将其写回。

lapply(all_files, function(x) {
    df <- read.csv(x, header = FALSE)
    if (df[1, 1] != "sample") {
      df <- df[10:nrow(df), ]
      write.csv(df, x, row.names = FALSE)
    }
})

答案 4 :(得分:1)

使用变量检查有效性:

awk 'NR==1 && !($0 ~ /^sample/) {skip=1} skip != 1 || NR >= 10 {print}' file.txt