>我有这样的文件
name AD01392 AV93289 AG98023 A723928
xyb323 232 3232 8992 3278
xyb897 343 434 344 3434
xyvg87 439 3434 2434 43434
我需要将此文件中的信息提取到 4 个单独的文件中提取第 1 列并迭代第 2、3 和 4 列,然后添加另一列,其中包含提取列的标题
文件 1
name AD01392
xyb323 232 AD01392
xyb897 343 AD01392
xyvg87 439 AD01392
文件 2
name AV93289
xyb323 3232 AV93289
xyb897 434 AV93289
xyvg87 3434 AV93289
其他 2 个文件依此类推。
我可以使用
awk '{print $1,$2}' file.tsv > file1.tsv
awk '{print $1,$3}' file.tsv > file2.tsv
awk '{print $1,$4}' file.tsv > file3.tsv
awk '{print $1,$5}' file.tsv > file5.tsv
但不确定如何从每列中提取第一行并将其作为一列添加到所有行。
非常感谢您的帮助和贡献。
您能否尝试按照awk
进行操作,并让我知道这是否对您有帮助。
awk 'FNR==1{a[1]=$1;for(i=2;i<=NF;i++){a[i]=$i;print a[1],a[i] > "File"++q;}next} {for(j=2;j<=NF;j++){print $1,$j,a[j] > "File"++o};o=""}' Input_file
现在也添加一个非一个衬里形式的解决方案。
awk '
FNR==1{
a[1]=$1;
for(i=2;i<=NF;i++){
a[i]=$i;
print a[1],a[i] > "File"++q}
next}
{
for(j=2;j<=NF;j++){
print $1,$j,a[j] > "File"++o}
o=""
}
' Input_file
以下内容:
awk 'NR==1{save=$2;print $1,$2}NR>1{print $1,$2,save}' file.tsv > file1.tsv
awk 'NR==1{save=$3;print $1,$3}NR>1{print $1,$3,save}' file.tsv > file2.tsv
awk 'NR==1{save=$4;print $1,$4}NR>1{print $1,$4,save}' file.tsv > file3.tsv
awk 'NR==1{save=$5;print $1,$5}NR>1{print $1,$5,save}' file.tsv > file5.tsv
打印最后一列,您只需将$2
、$3
、$4
、$5
的内容保存在 tmp 变量中,您将在整个文件过程中重复使用该变量。默认情况下,输出字段分隔符是空格,但您可以根据需要通过覆盖变量OFS
的内容来更改它,因此,如果您想例如将t
作为分隔符
awk 'NR==1{OFS="t";save=$2;print $1,$2}NR>1{print $1,$2,save}' file.tsv > file1.tsv
awk 'NR==1{OFS="t";save=$3;print $1,$3}NR>1{print $1,$3,save}' file.tsv > file2.tsv
awk 'NR==1{OFS="t";save=$4;print $1,$4}NR>1{print $1,$4,save}' file.tsv > file3.tsv
awk 'NR==1{OFS="t";save=$5;print $1,$5}NR>1{print $1,$5,save}' file.tsv > file5.tsv
起色:
我还建议使用以下awk
命令来处理文件一次且仅一次(假设您的大文件需要 2 小时才能处理(
awk 'BEGIN{OFS="t"}NR==1{save2=$2;save3=$3;save4=$4;save5=$5;print $1,$2> "file1.tsv";print $1,$3 > "file2.tsv"; print $1,$4 > "file3.tsv"; print $1,$5 > "file5.tsv";}NR>1{print $1,$2,save2 > "file1.tsv"; print $1,$3,save3 > "file2.tsv"; print $1,$4,save4 > "file3.tsv"; print $1,$5,save5 >
"file5.tsv";}' file.tsv
其中awk
代码为:
BEGIN{
OFS="t"
}
NR==1{
save2=$2;
save3=$3;
save4=$4;
save5=$5;
print $1,$2> "file1.tsv";
print $1,$3 > "file2.tsv";
print $1,$4 > "file3.tsv";
print $1,$5 > "file5.tsv";
}
NR>1{
print $1,$2,save2 > "file1.tsv";
print $1,$3,save3 > "file2.tsv";
print $1,$4,save4 > "file3.tsv";
print $1,$5,save5 > "file5.tsv";
}
测试:
$ more file?.tsv
::::::::::::::
file1.tsv
::::::::::::::
name AD01392
xyb323 232 AD01392
xyb897 343 AD01392
xyvg87 439 AD01392
::::::::::::::
file2.tsv
::::::::::::::
name AV93289
xyb323 3232 AV93289
xyb897 434 AV93289
xyvg87 3434 AV93289
::::::::::::::
file3.tsv
::::::::::::::
name AG98023
xyb323 8992 AG98023
xyb897 344 AG98023
xyvg87 2434 AG98023
::::::::::::::
file5.tsv
::::::::::::::
name A723928
xyb323 3278 A723928
xyb897 3434 A723928
xyvg87 43434 A723928