Как напечатать имя файла с данными, откуда данные поступают? - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть указанные ниже файлы в пути 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 голосов
/ 06 декабря 2018

A 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 печатается немедленно, требуется 2-й вызов sed, чтобы немного перемешать вывод.

Если интервал выводаслишком неравномерно, добавьте tr, чтобы преобразовать пробелы в табуляцию:

sed 's/[()]\|DEST//g;F' fb*.tril.cap | sed -n 'h;n;G;s/\n/ /gp' | 
tr -s ' '
0 голосов
/ 06 декабря 2018

Использование Perl one liner

> 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
>
0 голосов
/ 06 декабря 2018

Сначала я не могу протестировать свое решение для кода, но этот код может быть запущен для вас.

while read file_name
do
cat ${file_name} | awk -F' ' '$5 == "(DEST" { print 
$1, $2, $3, $5}' | awk -F')' '{print  $1, $2, $3, $4, $file_name}' | uniq >> output.csv
done < path_1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...