кошачьи колонки в 3 файлах - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть 3 файла, таких как:

file1_file:

scaffold_159    625 YP_009345712    0.284   447 289 9   96675   95377   196 625 6.963E-38   158
scaffold_159    625 YP_009345714    0.284   447 289 9   96675   95377   196 625 6.963E-38   158
IDBA_scaffold_24562 625 YP_009345713    0.464   56  20  2   2549    2686    10  65  7.513E-03   37

file2_file:

scaffold_159    625 YP_009345717    0.284   447 289 9   96675   95377   196 625 6.963E-38   158
scaffold_159    625 YP_009345718    0.284   447 289 9   96675   95377   196 625 6.963E-38   158
IDBA_scaffold_24562 625 YP_009345719    0.464   56  20  2   2549    2686    10  65  7.513E-03   37

file3_file:

scaffold_159    625 YP_009345711    0.284   447 289 9   96675   95377   196 625 6.963E-38   158
scaffold_159    625 YP_009345723    0.284   447 289 9   96675   95377   196 625 6.963E-38   158
IDBA_scaffold_24562 625 YP_009345721    0.464   56  20  2   2549    2686    10  65  7.513E-03   37

иЯ хотел бы получить только 3-ю часть файла 3 в одном new_file.txt.

Здесь я должен получить:

YP_009345712
YP_009345714
YP_009345713
YP_009345717
YP_009345718
YP_009345711
YP_009345723
YP_009345721

С этого момента я попытался:

cat file_names.txt | while read line; do cat /path1/${line}/path2/${line}_file > new_file.txt; done

в file_names.txt У меня есть:

file1
file2
file3

но я не знаю, как извлечь только 3-й столбец ...

Ps: 3 файла не находятся в одном каталоге:

/path1/file1/path2/file1_file 
/path1/file2/path2/file2_file 
/path1/file3/path2/file3_file 

Ответы [ 3 ]

3 голосов
/ 05 ноября 2019

РЕДАКТИРОВАТЬ: После разговора с OP стало известно, что его / ее файлы могут находиться в разных местах, поэтому в таком случае не могли бы вы попробовать следующее. Учитывая, что у вас есть Input_file, где есть все имена файлов. Я еще не проверял это.

file_name=$(awk '{val=(val?val OFS:"")"/path1/" $0 "/path2/" $0} END{print val}' file_names.txt)
awk '{print $3}' "$file_name"

ИЛИ

awk '{print $3}' $(awk '{val=(val?val OFS:"")"/path1/" $0 "/path2/" $0} END{print val}' file_names.txt)


Вы можете использовать awkздесь.

awk '{print $3}' /complete_path/file1 /complete_path/file2  /complete_path/file3
1 голос
/ 05 ноября 2019

Я думаю, что это может быть проще с

$ sed 's_.*_"path1/&/path2/&"_' filenames | xargs awk '{print $3}'

awk будет вызываться только один раз.

0 голосов
/ 05 ноября 2019

Итак, у вас есть файл fnames.txt с сотнями строк:

str1
str2
str3
str4
...

, и каждая строка представляет файл, расположенный в

/path1/${str}/path2/${str}_file

, где ${str} - это значение изfile fnames.txt.

Теперь вы хотите прочитать третий столбец, только из третьего файла:

$ str="$(awk '(NR==3){print; exit}' fnames.txt)"
$ file="/path1/${str}/path2/${str}_file"
$ awk '{print $3}' "$file" > new_file.txt

Всегда помните принцип KISS

...