[本人新年首帖]合并文件并在每行第一列添加文件名

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
highwind
帖子: 1362
注册时间: 2008-09-05 23:31
系统: LinuxMint17

[本人新年首帖]合并文件并在每行第一列添加文件名

#1

帖子 highwind » 2014-02-01 4:07

大伙儿新年好啊,正所谓天天学习,好好向上,大过年的还要帮人处理数据。现学现用记录如下:
情形:大批TSV文件(后缀名tsv)每行的字段用tab间隔。
需求:合并所有文件,但是得标识每行来自那个文件。
实行:
1.cd到文件所在目录下
2.执行

代码: 全选

for file in *.tsv ; do 
cat  "$file" | sed 's/^/ '"$file"'\t/'>>OUTPUT.tsv ; 
done
讲解:利用for循环例遍每个tsv文件(不用*,是因为文件太多,万一有些七七八八的混进来也不怕),然后用cat开始追加合并(>>),
用管道传递给sed进行行处理,引号里面参数意思是:替换(s/……/),行首(^)为文件名(‘“$file”’)加上tab间隔(\t)
之所以给每个$file又添加双引号是因为好多文件名里有空格,不加引号linux还以为它是两个文件,自然不行啦。

最后,再次祝福大伙儿马年吉祥啦。
头像
careone
帖子: 839
注册时间: 2007-12-17 21:41

Re: [本人新年首帖]合并文件并在每行第一列添加文件名

#2

帖子 careone » 2014-04-14 22:13

for file in *.tsv ; do
echo -e "\n$file\t" | cat - "$file" >> OUTPUT.tsv ;
done


echo -e 的作用是启动特殊字符 \n 换行符和 \t 制表符

cat 后面的 - 代表当前输出,这里具体来说就是 $file 字符串

另外 sed s是替换,sed a 似乎是行尾添加,sed i 是行首添加。试着搜索下相关sed 用法
魁拔不死,天下不宁。
魁拔既死,天下不平。
--------------
Careone <emacslocale^126.com>
https://sourceforge.net/projects/emacslocale/files/
cao627
帖子: 992
注册时间: 2007-12-05 10:57
系统: ubuntu14.04
来自: 金山

Re: [本人新年首帖]合并文件并在每行第一列添加文件名

#3

帖子 cao627 » 2014-04-14 23:10

代码: 全选

$ cat file
xxxx
$ echo -e "\n@@@@" | cat - file

@@@@
xxxx

得到的结果是在两行啊!楼上?

代码: 全选

$ echo "@@@@@ `cat file`"
@@@@@ xxxx
是不是这样
回复