Awk 使用bash对文件进行排序,将头保留为第一个位置
对文件进行排序时,我不会将标题保留在其位置: 文件1.tsvAwk 使用bash对文件进行排序,将头保留为第一个位置,awk,sed,Awk,Sed,对文件进行排序时,我不会将标题保留在其位置: 文件1.tsv Gene Number a 3 u 7 b 9 结果: a 3 b 9 Gene Number u 7 所以我在尝试这个代码: sed '1d' file_1.tsv | sort -k1,1 > file_1_sorted.tsv first='head -1 file_1.tsv' sed '1 "$first"' file_1_sorted.t
Gene Number
a 3
u 7
b 9
结果:
a 3
b 9
Gene Number
u 7
所以我在尝试这个代码:
sed '1d' file_1.tsv | sort -k1,1 > file_1_sorted.tsv
first='head -1 file_1.tsv'
sed '1 "$first"' file_1_sorted.tsv
我所做的是删除头并对文件的其余部分进行排序,然后再次尝试添加头。但我无法执行最后一部分,因此我想知道如何复制原始文件的标题并将其作为新文件的第一行插入,而不替换其实际第一行。请尝试以下操作
awk '
FNR==1{
first=$0
next
}
{
val=(val?val ORS:"")$0
}
END{
print first
print val | "sort"
}
' Input_file
逻辑解释:
- 检查条件
,查看其第一行是否正确;然后将其值保存到变量,并通过FNR==1
移动到下一行next
- 然后继续将所有行的值附加到另一个具有新行的变量,直到最后一行
- 现在转到该代码的
块,该块在读取完输入文件后执行,打印第一行值,并将END
命令放在其余行值上sort
- 请您尝试以下内容
awk '
FNR==1{
first=$0
next
}
{
val=(val?val ORS:"")$0
}
END{
print first
print val | "sort"
}
' Input_file
逻辑解释:
- 检查条件
,查看其第一行是否正确;然后将其值保存到变量,并通过FNR==1
移动到下一行next
- 然后继续将所有行的值附加到另一个具有新行的变量,直到最后一行
- 现在转到该代码的
块,该块在读取完输入文件后执行,打印第一行值,并将END
命令放在其余行值上sort
Gene Number
a 3
b 9
u 7
输出:
Gene Number
a 3
b 9
u 7
您也可以这样做:
{ head -1; sort; } < file_1.tsv
{head-1;sort;}
**更新**
对于macos:
{ IFS= read -r header; printf '%s\n' "$header" ; sort; } < file_1.tsv
{IFS=read-r头;printf'%s\n'$header'排序;}
您也可以这样做:
{ head -1; sort; } < file_1.tsv
{head-1;sort;}
**更新**
对于macos:
{ IFS= read -r header; printf '%s\n' "$header" ; sort; } < file_1.tsv
{IFS=read-r头;printf'%s\n'$header'排序;}更简单的awk
$ awk 'NR==1{print; next} {print | "sort"}' file
更简单的awk
$ awk 'NR==1{print; next} {print | "sort"}' file
这将在每个UNIX框上使用任何awk、排序和剪切任何shell,并且无论输入是来自管道(当您无法读取它两次时)还是来自文件(当您可以读取时),都将起作用,并且不涉及awk生成子shell:
awk -v OFS='\t' '{print (NR>1), $0}' file | sort -k1,1n -k2,2 | cut -f2-
上面使用awk将0粘贴在标题行的前面,将1粘贴在其余字段的前面,这样您就可以按该数字排序,然后再按任何其他要排序的字段排序,然后再次使用剪切删除添加的字段。这是分阶段的:
$ awk -v OFS='\t' '{print (NR>1), $0}' file
0 Gene Number
1 a 3
1 u 7
1 b 9
$ awk -v OFS='\t' '{print (NR>1), $0}' file | sort -k1,1n -k2,2
0 Gene Number
1 a 3
1 b 9
1 u 7
$ awk -v OFS='\t' '{print (NR>1), $0}' file | sort -k1,1n -k2,2 | cut -f2-
Gene Number
a 3
b 9
u 7
这将在每个UNIX框上使用任何awk、排序和剪切任何shell,并且无论输入是来自管道(当您无法读取它两次时)还是来自文件(当您可以读取时),都将起作用,并且不涉及awk生成子shell:
awk -v OFS='\t' '{print (NR>1), $0}' file | sort -k1,1n -k2,2 | cut -f2-
上面使用awk将0粘贴在标题行的前面,将1粘贴在其余字段的前面,这样您就可以按该数字排序,然后再按任何其他要排序的字段排序,然后再次使用剪切删除添加的字段。这是分阶段的:
$ awk -v OFS='\t' '{print (NR>1), $0}' file
0 Gene Number
1 a 3
1 u 7
1 b 9
$ awk -v OFS='\t' '{print (NR>1), $0}' file | sort -k1,1n -k2,2
0 Gene Number
1 a 3
1 b 9
1 u 7
$ awk -v OFS='\t' '{print (NR>1), $0}' file | sort -k1,1n -k2,2 | cut -f2-
Gene Number
a 3
b 9
u 7
这对我不起作用。它只打印第一行,没有对其余行进行排序。>GNU bash,5.0.16(1)版-发布(x86_64-apple-darwin17.7.0)对文件进行排序可能sed-i-e'e(head-1;sort)@EricBolinger,head--version
给出了head(GNU coreutils)8.30
,也许macos上的head
已经占据了所有行。谢谢Philippe。实际上,这个头
可执行文件是从FreeBSD移植到Mac OS X的。它不理解--version
选项。但是在二进制文件上运行strings
会产生:$FreeBSD:src/usr.bin/head/head.c,v1.20 2007/01/11 20:23:01 brooks Exp$
,看起来像是CVS注入的记录。这对我来说不起作用。它只打印第一行,没有对其余行进行排序。>GNU bash,5.0.16(1)版-发布(x86_64-apple-darwin17.7.0)对文件进行排序可能sed-i-e'e(head-1;sort)@EricBolinger,head--version
给出了head(GNU coreutils)8.30
,也许macos上的head
已经占据了所有行。谢谢Philippe。实际上,这个头
可执行文件是从FreeBSD移植到Mac OS X的。它不理解--version
选项。但是在二进制文件上运行strings
会产生:$FreeBSD:src/usr.bin/head/head.c,v1.20 2007/01/11 20:23:01 brooks Exp$
,看起来像是一个CVS注入的记录。