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
只会调用一次。
我有 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
只会调用一次。