powershell怎么获取文本的最后一行

powershell怎么获取文本的最后一行,第1张

PowerShell中,可以通过Get-Content这个cmdlet来获取文本文件内容。Get-Content将一个文本文件读取到一个数组中,每一个数组元素就是文件的一行内容。比如一个文本文件内容如下:

复制代码 代码如下:

111

222

333

那么,使用Get-Content获取到一个数组,数组包括三个元素,值分别为:$a[0]="111",$a[1]="222",$a[2]="333"。

关于Get-Content读取文本文件的内容,还有一个参数需要提一下,那就是-totalcount,它的含义表示从文本文件中获取多少行。比如:Get-Content d:\1.txt -totalcount 10,表示从d:\1.txt中读取出10行内容。

好了,有了以上两个方面的知识,我们来看看PowerShell中,如何使用Get-Content来获取文件文件的第N行内容。比如,我们要获取上面文件中的第二行,也就是“222”。程序如下:

复制代码 代码如下:

PS C:\Users\splaybow>(Get-Content d:\1.txt -TotalCount 2)[-1]

222

解释一下上面的结果:

1、“Get-Content d:\1.txt -TotalCount 2”这一段我们应该比较明确了,它表示从d:\1.txt中取出前2行。

2、把前两行的对象加括号,然后取[-1],是表示取数组元素的最后一个值。因为前面是只读的2行,那么2行组成的数组,最后一个值就是第2行的值。于是实现了获取文本文件第N行内容的功能

假设你这个.unl文件叫 file.unl,并且内容不含斜杠 / 。

脚本大致如下:

#!/bin/bash

myfile=file.unl

touch tmp

while read line

do

grep "$line" tmp >/dev/null 2>&1

if [ $? -eq 0 ]then

num=`awk '{print $NF}' tmp`

num=`expr $num + 1`

sed -i “s/^\($line\t\)[0-9]*$/\1$num/” tmp

else

echo -e "$line\t1" >>tmp

fi

done <$myfile# --->1), 2)

awk '$NF>1{print}' tmp >err.unl # --->3)

sed -i 's/^\(..*\)\t[0-9]*$/\1/' tmp

mv -f tmp $myfile # --->4)

exit 0

思路就是,

1)遍历 unl 文件的每一行,逐行拷贝一份到临时文件tmp中,后面附加一个出现的次数。

2)遍历的同时到tmp文件中去查找是否有已存在的相同记录,如果有,就只是更新tmp文件中记录的次数而不添加一个新记录。

3)最后根据tmp文件中记录的次数是否大于1来生成err.unl文件,记录重复的行及总共出现的次数。

4)将tmp文件中的次数记录去除即得到更新后的 unl 文件。

由于要求要覆盖原unl文件,所以这里存在风险。 建议运行脚本前先备份一下原unl文件。

最后,恕我直言,这个题目的难度不止10分。

你看,while循环,grep / sed / awk,全用上了 ^_^

————————————————————————————————————

发现一个更简练的方法,两条命令即可搞定:

awk '{s[$0]+=1} END{for(a in s) print a, s[a]}' file.unl >err.unl

awk '{print $1}' err.unl >file.unl

当然,前提是unl文件的每行内容不能含有空格或TAB之类的分隔符。

参考了 http://zhidao.baidu.com/question/271261293.html#here 这个问题中shuguangbo童鞋的回答。

tail命令看文件结尾部分, head看开头部分, sed可以看任意位置的文件内容。

如果不懂linux的shell的话, 可以找w o解决。

以后要是遇到了linux方面的问题, 都可以帮忙解决哦!


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9913457.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-03
下一篇2023-05-03

发表评论

登录后才能评论

评论列表(0条)

    保存