从每个文件中提取相同的列到一个文件
Extracting same column from each file to one file
我有以下包含 171 个文件的数据集。
CHR:POS REF:ALT BREED
6:85406127 T:A 0.333333
6:85406128 T:C 0
6:85406129 C:G 0.333333
6:85406130 T:G 0.833333
期望的输出是
CHR:POS REF:ALT BREED BREED2 BREED3 ... 171st file
6:85406127 T:A 0.333333 0.33 0.5 .... 0.4
6:85406128 T:C NA 0.33 0.5 .... 0.4
6:85406129 C:G 0.333333 0.33 NA .... 0
6:85406130 T:G 0.833333 0.33 0.5 .... NA
文件名包含品种名称。第一列和第二列包含每个文件中的相同信息。我如何只从每个文件中提取第三列,同时保留第一个文件中的所有列?
我将第一个文件移动到其他文件夹中以排除提取。下面的命令没有给出结果。
cut -d " " -f3 *.txt | paste ../breedname.txt - > output.txt
我也曾尝试使用这些问题中显示的 awk 命令,但它对我的数据集不起作用。
- Print every nth column of a file
欢迎任何帮助!
这是一种非常快速但肮脏的方法:
假设您的文件顺序相同:
$ awk '(FNR==NR){a[FNR]=[=10=];next}
{a[FNR]=a[FNR] FS $NF}
END{for(i=1;i<=FNR;++i) print a[i]}' file1 file2 file3 ... filen
如果你想让 header 更干净一点:
$ awk '(FNR==NR){a[FNR]=[=11=] (FNR==1?++c:"");next}
{a[FNR]=a[FNR] FS $NF (FNR==1?++c:"")}
END{for(i=1;i<=FNR;++i) print a[i]}' file1 file2 file3 ... filen
假设您的文件顺序不同:
$ awk '{key= FS }
(FNR==NR){a[key]=[=12=] (FNR==1?++c:"");next}
{a[key]=a[key] FS $NF (FNR==1?++c:"")}
END{for(i in a) print a[i]}' file1 file2 file3 ... filen
我会这样做:
paste -d " " *.txt | awk '{printf "%s %s ",,; for (i = 3; i <= NF; i+=3){printf "%s ",$i} print ""}'
paste
垂直连接行,因此每一列都彼此相邻。之后,您只需 select 所需的列即可。
我有以下包含 171 个文件的数据集。
CHR:POS REF:ALT BREED
6:85406127 T:A 0.333333
6:85406128 T:C 0
6:85406129 C:G 0.333333
6:85406130 T:G 0.833333
期望的输出是
CHR:POS REF:ALT BREED BREED2 BREED3 ... 171st file
6:85406127 T:A 0.333333 0.33 0.5 .... 0.4
6:85406128 T:C NA 0.33 0.5 .... 0.4
6:85406129 C:G 0.333333 0.33 NA .... 0
6:85406130 T:G 0.833333 0.33 0.5 .... NA
文件名包含品种名称。第一列和第二列包含每个文件中的相同信息。我如何只从每个文件中提取第三列,同时保留第一个文件中的所有列?
我将第一个文件移动到其他文件夹中以排除提取。下面的命令没有给出结果。
cut -d " " -f3 *.txt | paste ../breedname.txt - > output.txt
我也曾尝试使用这些问题中显示的 awk 命令,但它对我的数据集不起作用。
- Print every nth column of a file
欢迎任何帮助!
这是一种非常快速但肮脏的方法:
假设您的文件顺序相同:
$ awk '(FNR==NR){a[FNR]=[=10=];next}
{a[FNR]=a[FNR] FS $NF}
END{for(i=1;i<=FNR;++i) print a[i]}' file1 file2 file3 ... filen
如果你想让 header 更干净一点:
$ awk '(FNR==NR){a[FNR]=[=11=] (FNR==1?++c:"");next}
{a[FNR]=a[FNR] FS $NF (FNR==1?++c:"")}
END{for(i=1;i<=FNR;++i) print a[i]}' file1 file2 file3 ... filen
假设您的文件顺序不同:
$ awk '{key= FS }
(FNR==NR){a[key]=[=12=] (FNR==1?++c:"");next}
{a[key]=a[key] FS $NF (FNR==1?++c:"")}
END{for(i in a) print a[i]}' file1 file2 file3 ... filen
我会这样做:
paste -d " " *.txt | awk '{printf "%s %s ",,; for (i = 3; i <= NF; i+=3){printf "%s ",$i} print ""}'
paste
垂直连接行,因此每一列都彼此相邻。之后,您只需 select 所需的列即可。