3 个文件中的 cat 特定列

cat specific columns in 3 files

我有 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

而且我只想在单个 new_file.txt 中获取 3 个文件的第 3 部分。

这里我应该得到:

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 

编辑: 与 OP 聊天后得知 his/her 文件可能位于不同的位置,所以在那案例你可以尝试以下。考虑到您有一个 Input_file,所有文件名都在那里。我还没有测试它。

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

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


你可以在这里使用 awk

awk '{print }' /complete_path/file1 /complete_path/file2  /complete_path/file3

所以你有一个包含数百个字符串的文件fnames.txt

str1
str2
str3
str4
...

并且每个字符串代表位于

中的一个文件
/path1/${str}/path2/${str}_file

其中 ${str} 是来自文件 fnames.txt.

的值

现在你想阅读第三列,仅来自第三个文件:

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

永远记住KISS principle

我认为

可以更简单
$ sed 's_.*_"path1/&/path2/&"_' filenames | xargs awk '{print }'

awk只会调用一次。