
复制代码 代码如下:
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方面的问题, 都可以帮忙解决哦!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)