使用PowerShell删除文本文件的第一行

我试图在导入它们之前删除大约5000个文本文件的第一行。

我对PowerShell还是很陌生,因此不确定要搜索什么或如何进行此操作。 我当前使用伪代码的概念:

set-content file (get-content unless line contains amount)

但是,我似乎无法弄清楚如何执行包含操作。

Buddy Lindsey asked 2020-07-08T22:27:19Z

10个解决方案

36 votes

它不是世界上最高效的,但这应该可以工作:

get-content $file |

select -Skip 1 |

set-content "$file-temp"

move "$file-temp" $file -Force

Richard Berg answered 2020-07-08T22:27:28Z

35 votes

虽然我非常欣赏@hoge的答案,因为它提供了非常简洁的技术和用于将其概括化的包装函数,并且我对此表示鼓励,但我不得不评论使用临时文件的其他两个答案(它像指甲一样at我 在黑板上!)。

假设文件不是很大,您可以通过明智地使用括号来强制管道在不连续的部分中进行操作(从而避免使用临时文件):

(Get-Content $file | Select-Object -Skip 1) | Set-Content $file

...或简写为:

(gc $file | select -Skip 1) | sc $file

Michael Sorens answered 2020-07-08T22:27:57Z

10 votes

使用变量表示法,可以在没有临时文件的情况下进行操作:

${C:\file.txt} = ${C:\file.txt} | select -skip 1

function Remove-Topline ( [string[]]$path, [int]$skip=1 ) {

if ( -not (Test-Path $path -PathType Leaf) ) {

throw "invalid filename"

}

ls $path |

% { iex "`${$($_.fullname)} = `${$($_.fullname)} | select -skip $skip" }

}

hoge answered 2020-07-08T22:28:17Z

8 votes

我只需要执行相同的任务,然后StreamReader在读取1.6 GB文件时接管了我计算机上的4 GB RAM。 读取整个文件后至少有20分钟没有完成(如Process Explorer中的Read Bytes报道),此时我不得不将其杀死。

我的解决方案是使用更多的.NET方法:StreamReader + StreamWriter。请参阅此答案,以获得有关讨论性能的好答案:在Powershell中,按记录类型拆分大文本文件的最有效方法是什么?

下面是我的解决方案。 是的,它使用一个临时文件,但就我而言,没关系(这是一个庞大的SQL表创建和插入语句文件):

PS> (measure-command{

$i = 0

$ins = New-Object System.IO.StreamReader "in/file/pa.th"

$outs = New-Object System.IO.StreamWriter "out/file/pa.th"

while( !$ins.EndOfStream ) {

$line = $ins.ReadLine();

if( $i -ne 0 ) {

$outs.WriteLine($line);

}

$i = $i+1;

}

$outs.Close();

$ins.Close();

}).TotalSeconds

它返回:

188.1224443

AASoft answered 2020-07-08T22:28:51Z

5 votes

受AASoft的回答启发,我进一步改进了它:

避免在每个循环中使用循环变量5.3s和与4s的比较

将执行包装到5.3s块中,以始终关闭正在使用的文件

使解决方案适用于从文件开头删除的任意行

使用变量5.3s引用当前目录

这些更改导致以下代码:

$p = (Get-Location).Path

(Measure-Command {

# Number of lines to skip

$skip = 1

$ins = New-Object System.IO.StreamReader ($p + "\test.log")

$outs = New-Object System.IO.StreamWriter ($p + "\test-1.log")

try {

# Skip the first N lines, but allow for fewer than N, as well

for( $s = 1; $s -le $skip -and !$ins.EndOfStream; $s++ ) {

$ins.ReadLine()

}

while( !$ins.EndOfStream ) {

$outs.WriteLine( $ins.ReadLine() )

}

}

finally {

$outs.Close()

$ins.Close()

}

}).TotalSeconds

第一次更改使我的60 MB文件的处理时间从5.3s减少到4s。其余的更改更加美观。

Oliver answered 2020-07-08T22:29:37Z

3 votes

我刚从一个网站中学到:

Get-ChildItem *.txt | ForEach-Object { (get-Content $_) | Where-Object {(1) -notcontains $_.ReadCount } | Set-Content -path $_ }

或者,您可以使用别名使其简短,例如:

gci *.txt | % { (gc $_) | ? { (1) -notcontains $_.ReadCount } | sc -path $_ }

Luke Du answered 2020-07-08T22:30:01Z

2 votes

$x = get-content $file

$x[1..$x.count] | set-content $file

就这么多。 冗长无聊的解释如下。 Get-content返回一个数组。 正如本文和其他Scripting Guy文章中所展示的,我们可以“索引”数组变量。

例如,如果我们定义这样的数组变量,

$array = @("first item","second item","third item")

所以$ array返回

first item

second item

third item

然后我们可以“索引”该数组以仅检索其第一个元素

$array[0]

或仅是第二

$array[1]

或从第二个到最后一个的索引值范围。

$array[1..$array.count]

noam answered 2020-07-08T22:30:43Z

1 votes

跳过不起作用,所以我的解决方法是

$LinesCount = $(get-content $file).Count

get-content $file |

select -Last $($LinesCount-1) |

set-content "$file-temp"

move "$file-temp" $file -Force

Mariusz Biesiekierski answered 2020-07-08T22:31:03Z

0 votes

使用多重分配技术从文件中删除第一行的另一种方法。 参考链接

$firstLine, $restOfDocument = Get-Content -Path $filename

$modifiedContent = $restOfDocument

$modifiedContent | Out-String | Set-Content $filename

Venkataraman R answered 2020-07-08T22:31:23Z

-1 votes

对于较小的文件,您可以使用以下命令:

&C:\ windows \ system32 \ more +1 oldfile.csv> newfile.csv | 零

...但是在处理我的16MB示例文件方面不是很有效。 它似乎没有终止并释放newfile.csv上的锁。

danielmbarlow answered 2020-07-08T22:31:52Z

linux 去掉csv文件第一行,使用PowerShell删除文本文件的第一行相关推荐

  1. 使用win中excel打开linux下.csv文件乱码问题

    使用win中excel打开linux下.csv文件乱码问题 1.问题原因 不同系统的字符集编码不一样 windows使用的是gbk格式 linux使用的是utf8格式 检查文件编码格式 file 文件 ...

  2. dataframe只打印第一行_linux/unix下如何使用命令行删除文本文件的第一行?

    在日常开发中,我们也经常会遇到使用Linux命令行删除文本文件的第一行的情况. 本文将与您分享如何使用linux命令行工具删除文本文件的第一行. 以下是本文中使用的测试文本文件的内容: This is ...

  3. python处理csv文件将id相同的行合并到同一行并用符号将其隔开_Python探索性数据分析,这样才容易掌握...

    作者 | Riti Dass译者 | LJY整理 | Lemonbit译文来源 | Python数据之道(ID:PythonDataLab) 导语:理解你的数据的最佳方法是花时间去研究它. Pytho ...

  4. 问题记录:从EXCEL2013导入数据CSV文件,提示报错“此文本文件包含的数据无法放置在一个工作表中。如要继续导入可容纳的数据,请单击确定。。。”

    使用的工具是:MicrosoftOffice Excel 2013.Notepad++ v7.5.8 Spark数据处理任务生成了CSV格式的数据文件,然后要手动将CSV数据转换成excel文件,为了 ...

  5. python中csv文件通过什么表示字符_python – 如果行包含CSV文件中的字符串,则删除该行...

    我在删除包含一列中的字符串的文本文件中的行时遇到问题.到目前为止,我的代码无法删除该行,但它能够读取文本文件并将其作为CSV文件保存到单独的列中.但这些行不会被删除. 这就是该列中的值如下所示: Sh ...

  6. linux 的pwd文件被删,恢复被删除的文件-linux篇

    本文转自IBM中国上的文档 [http://www.ibm.com/developerworks/cn/linux/l-cn-filesrc/] [http://www.ibm.com/develop ...

  7. linux mysql csv文件_Linux MySQL数据库如何导出数据文件?导出csv语句命令

    广告 2017年11月13日 MySQL中你可以使用SELECT ... INTO OUTFILE语句来简单的导出数据到文本文件上. 使用SELECT ... INTO OUTFILE语句导出数据 以 ...

  8. linux 合并csv文件 cat,Python:将两个CSV文件合并为多级JSON

    还有一个选择.当你开始添加更多文件时,我试着让它更容易管理.可以在命令行上运行并提供参数,每个要添加的文件都有一个参数.基因/样本名称存储在字典中以提高效率.所需JSON对象的格式化是在每个类的for ...

  9. 怎么导出linux的脚本文件夹,用shell脚本生成文本文件

    在Linux上写shell脚本的一个很重要的意图是自动化.假如我们希望自动生成一个具有特定内容的文本文件,应该怎么实现呢? 我用过两个方法,下面分别举例说明.为了更通用,这两个例子中的文本内容都是多行 ...

  10. linux rsync删文件速度,为什么用rsync删除大量文件的时候比用rm快

    为什么用rsync删除大量文件的时候比用rm快 今天研究怎么在Linux下快速删除大量文件, 搜到很多人都说可以用rsync来删除大量文件, 速度比rm要快很多,但是没有人说为什么, 仔细研究了一下原 ...

最新文章

  1. mysql隐藏密码_MySQL在Linux系统中隐藏命令行中的密码的方法
  2. 世界无人帆船大赛首次登陆中国,水手梦也能用代码实现
  3. 居然有人撸了一个网易云音乐云村,高手在民间!
  4. 为什么有时打不开爬取到的图片
  5. windows下安装nginx
  6. 利用shell脚本监控网站状态
  7. python unpack_ip地址处理每天10行python代码系列
  8. 服务器网站显示多协议,解决高防IIS8服务器https协议多个同时访问的解决方法
  9. ArcGIS10.6使用ArcGIS Diagrammer
  10. python工具包:Python Swiftclient
  11. B2C多用户商城系统源码
  12. 计算机编程告白,程序员的520,五个表白代码,一看就会
  13. 我的孤独自学之路----kali 安装及更新源
  14. 码支付易支付等接口对接方法
  15. B. Pleasant Pairs
  16. ffmpeg截取指定视频中的一段视频
  17. Quartz组件介绍
  18. unity3d俯视角简易移动控制脚本及其易错点小分享
  19. 【云原生】我怎么会和这个数据库杠上了?
  20. c语言摆花问题,屋里摆花有讲究,不能随便放,5个摆花小技巧赶紧学

热门文章

  1. (转)When Milliseconds Make Millions
  2. 机器学习笔记(二十四):召回率、混淆矩阵
  3. 中国电子技术标准化研究院与Linux基金会战略合作签约仪式圆满落幕
  4. 【图像融合】基于matalb四叉树的加权聚焦多聚焦图像融合【含Matlab源码 1818期】
  5. 【手写数字识别】基于matlab GUI贝叶斯+线性分类器手写数字识别【含Matlab源码 828期】
  6. 【滤波器】基于matlab GUI高通+低通+带通+带阻FIR滤波器设计【含Matlab源码 699期】
  7. 【游戏】基于matlab GUI万年历【含Matlab源码 257期】
  8. SPSS 非参数检验(图文+数据集)【SPSS 021期】
  9. java jlist组件_Java中Jlist的Swing组件
  10. r语言 生成等差序列_使用序列模型生成自然语言