在Linux上处理文本的一些命令

2017-07-17 Lu Huang 更多博文 » 博客 » GitHub »

原文链接 https://hlthu.github.io/linux/2017/07/17/linux-text-process.html
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。


最近使用了Aishell开源的中文语料库,做Kaldi的实验。但是需要自己准备wav.scptextcorpus.txt等文件,这些都是一些关于文本处理的,自己当时也查阅了很多,现将几个比较常用的总结如下。

vim

这里主要是使用vim的一些命令

  • 每行的行首都添加一个字符串:%s/^/要插入的字符串
  • 每行的行尾都添加一个字符串:%s/$/要插入的字符串
  • 删除行尾空格:%s/\s+$//g
  • 删除行首多余空格:%s/^\s*// 或者%s/^ *//
  • 删除沒有內容的空行:%s/^$// 或者 g/^$/d
  • 删除包含有空格组成的空行:%s/^\s*$// 或者 g/^\s*$/d
  • 删除以空格或TAB开头到结尾的空行:%s/^[ |\t]*$// 或者 g/^[ |\t]*$/d
  • 把文中的所有字符串abc……xyz替换为xyz……abc可以有下列写法
    • %s/abc\(.*\)xyz/xyz\1abc/g
    • %s/\(abc\)\(.*\)\(xyz\)/\3\2\1/g

awk

  • 打印文件的第一列(域):awk '{print $1}' filename
  • 打印文件的前两列(域):awk '{print $1,$2}' filename
  • 打印完第一列,然后打印第二列:awk '{print $1 $2}' filename
  • 打印文本文件的总行数:awk 'END{print NR}' filename
  • 打印文本第一行:awk 'NR==1{print}' filename
  • 打印文本第二行第一列:sed -n "2, 1p" filename | awk 'print $1'

sed

  • 删除文档的第一行 sed -i '1d' <file>

  • 删除文档的最后一行 sed -i '$d' <file>

  • 删除文件中的一行 sed -i '3d' <file>

  • 删除文件中包含某个关键字开头的所有行 sed -i '/^QWQ/d' <file>

  • 删除文件中包含某个关键字的所有行 sed -i '/QWQ/d' <file>

删除重复行

  • 第一,用sort+uniq,注意,单纯uniq是不行的。sort -n test.txt | uniq

  • 第二,用sort+awk命令,注意,单纯awk同样不行,原因同上。sort -n $file | awk '{if($0!=line)print; line=$0}'  

  • 第三,用sort+sed命令,同样需要sort命令先排序。sort -n $file | sed '$!N; /^.∗\n\1$/!P; D'

空格变换行

cat tmp1 | sed 's/ /\n/g ' > tmp2

按列合并文件

#cat pas1 
ID897 
ID666 
ID982 
#cat pas2 
P.Jones 
S.Round 
L.Clip 
# paste pas1 pas2 
ID897   P.Jones 
ID666   S.Round 
ID982   L.Clip 

删除文件中的特定字符

sed 's/[, 。 ? “ ”]//g' urfile

使用sed或awk删除文件第一列

awk '{$1="";print $0}' file

sed -e 's/[^ ]* //' file

从一个文件中挑选出另一个文件所有行出现的行

find S* -iname '*.wav' | grep -f ../../transcript/train.utt > wav