如何用数据来自何处打印文件名?

时间:2018-12-06 09:46:00

标签: linux shell unix

我在路径1中有以下提到的文件

fb1.tril.cap
fb2.tril.cap
fb3.tril.cap

例如文件fb1.tril.cap中的数据如下所示,

AT99565 150 500 (DEST 81) 
AT99565 101 501 (DEST 883) 
AT99565 152 502 (419) 

例如文件fb2.tril.cap中的数据如下所示,

AT99565 103 1503 (DEST 165) 
AT99565 104 154  (DEST 199) 

例如文件fb3.tril.cap中的数据如下所示,

RT61446 80 863 (DEST 968) 
RT20447 32 39 (DEST 570) 
RT51224 73 74 (592) 

我已经编写了如下所示的代码来打印必填字段,

while read file_name
do
cat ${file_name} | awk -F' ' '$4 == "(DEST" { print 
$1, $2, $3, $5}' | awk -F')' '{print  $1, $2, $3, $4}' | uniq >> output.csv
done < path_1

我低于输出,

AT99565 150 500 81
AT99565 101 501 883
AT99565 103 1503 165
AT99565 104 154  199
RT61446 80 863 968
RT20447 32 39 570

但是我也想打印文件名以及数据来自哪里,如下所示,

AT99565 150 500 81 fb1.tril.cap
AT99565 101 501 883 fb1.tril.cap
AT99565 103 1503 165 fb2.tril.cap
AT99565 104 154  199 fb2.tril.cap
RT61446 80 863 968 fb3.tril.cap
RT20447 32 39 570 fb3.tril.cap

任何人都可以通过打印文件名以及数据来帮助我完成我的工作。预先感谢。

3 个答案:

答案 0 :(得分:0)

首先,我无法测试我的代码解决方案,但此代码可能会为您运行。

CMake

答案 1 :(得分:0)

一个sed单线:

sed 's/[()]\|DEST//g;F' fb*.tril.cap | sed -n 'h;n;G;s/\n/ /gp'

工作原理:

  1. s/[()]\|DEST//g:无需解析(DEST等,只需删除它们即可。之后剩下的是四个所需的项目。

  2. 然后使用sed F 文件名命令打印文件名。

  3. 由于F立即打印,因此需要第二次sed调用才能处理输出。

如果输出间距太不均匀,请添加tr以便将空格转换为制表符:

sed 's/[()]\|DEST//g;F' fb*.tril.cap | sed -n 'h;n;G;s/\n/ /gp' | 
tr -s ' '

答案 2 :(得分:0)

使用Perl一个衬纸

> ls -l fb*tril*cap
-rw-r--r-- 1 aaaaa bbbbb 77 Dec  6 09:20 fb1.tril.cap
-rw-r--r-- 1 aaaaa bbbbb 58 Dec  6 09:21 fb2.tril.cap
-rw-r--r-- 1 aaaaa bbbbb 74 Dec  6 09:21 fb3.tril.cap
> perl -lane ' print $_,$ARGV if $F[3]=~/\(DEST/ and s/\(DEST //g and s/\)//g '  fb*tril*cap
AT99565 150 500 81 fb1.tril.cap
AT99565 101 501 883 fb1.tril.cap
AT99565 103 1503 165 fb2.tril.cap
AT99565 104 154  199 fb2.tril.cap
RT61446 80 863 968 fb3.tril.cap
RT20447 32 39 570 fb3.tril.cap
>