在Linux上处理文本的一些命令
原文链接 https://hlthu.github.io/linux/2017/07/17/linux-text-process.html
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。
最近使用了Aishell开源的中文语料库,做Kaldi的实验。但是需要自己准备wav.scp
、text
和corpus.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