如何使用 bash 使用特定列中的值从一个文件中保存不同的文件
How to save different file from one file using value in specific column using bash
我想使用列 </code> 中的值保存行,并使用 <code>
中的值将行保存在一个文件中,如果它有不同的值,则将其保存到另一个新文件中
112 14.7 114.98 -0.92 -0.12
112 14.8 114.02 -0.78 0.76
112 14.1 114.99 -0.98 -0.11
113 12.5 111.77 1.87 -1.88
113 12.6 111.89 -0.98 -1.65
115 15.7 110.8 2.06 0.72
118 11.9 111.01 -1.04 0.98
我想要的是
file1=p004112.txt
112 14.7 114.98 -0.92 -0.12
112 14.8 114.02 -0.78 0.76
112 14.1 114.99 -0.98 -0.11
file2=p004113.txt
113 12.5 111.77 1.87 -1.88
113 12.6 111.89 -0.98 -1.65
file3=p004115.txt
115 15.7 110.8 2.06 0.72
file4=p004118.txt
118 11.9 111.01 -1.04 0.98
必须这样更改的文件有 namefile p004.txt p005.txt
我试过这样
for i in `ls p????.txt|sed "s/.txt//g"`;do awk '{file=${i}".txt" print >> file}' ${i}.txt;done
但它不起作用 :( 有人有解决这个问题的办法吗?
谢谢
使用您显示的示例,请尝试执行以下操作。虽然您的示例显示为已排序的第一列,但我仍然使用 sort
对第一列的文件进行排序,以防您的整个文件按第一列排序,然后从下面删除排序命令并粘贴 Input_file
在 awk
程序结束时。
sort -k1 Input_file | awk 'prev!={close(outputFile);outputFile=("p004"".txt")} {print > (outputFile);prev=}'
或上述解决方案的非在线形式:
sort -k1 Input_file |
awk '
prev!={
close(outputFile)
outputFile=("p004"".txt")
}
{
print > (outputFile)
prev=
}
'
解释: 简单的解释是:首先用第 1 列对 Input_file 进行排序,并将其输出作为输入发送到 awk
命令。然后在 awk
程序中:根据 OP 的需要将 outputFile 名称设置为 p004,第一列名称附加 .txt 并在后端关闭输出文件以避免“打开的文件太多”错误,这是每次第一次完成列正在更改(不等于其上一行的值)。然后将每一行打印到输出文件中,并将 prev 值设置为每行中的第一列值。
我想使用列 </code> 中的值保存行,并使用 <code>
中的值将行保存在一个文件中,如果它有不同的值,则将其保存到另一个新文件中
112 14.7 114.98 -0.92 -0.12
112 14.8 114.02 -0.78 0.76
112 14.1 114.99 -0.98 -0.11
113 12.5 111.77 1.87 -1.88
113 12.6 111.89 -0.98 -1.65
115 15.7 110.8 2.06 0.72
118 11.9 111.01 -1.04 0.98
我想要的是
file1=p004112.txt
112 14.7 114.98 -0.92 -0.12
112 14.8 114.02 -0.78 0.76
112 14.1 114.99 -0.98 -0.11
file2=p004113.txt
113 12.5 111.77 1.87 -1.88
113 12.6 111.89 -0.98 -1.65
file3=p004115.txt
115 15.7 110.8 2.06 0.72
file4=p004118.txt
118 11.9 111.01 -1.04 0.98
必须这样更改的文件有 namefile p004.txt p005.txt
我试过这样
for i in `ls p????.txt|sed "s/.txt//g"`;do awk '{file=${i}".txt" print >> file}' ${i}.txt;done
但它不起作用 :( 有人有解决这个问题的办法吗?
谢谢
使用您显示的示例,请尝试执行以下操作。虽然您的示例显示为已排序的第一列,但我仍然使用 sort
对第一列的文件进行排序,以防您的整个文件按第一列排序,然后从下面删除排序命令并粘贴 Input_file
在 awk
程序结束时。
sort -k1 Input_file | awk 'prev!={close(outputFile);outputFile=("p004"".txt")} {print > (outputFile);prev=}'
或上述解决方案的非在线形式:
sort -k1 Input_file |
awk '
prev!={
close(outputFile)
outputFile=("p004"".txt")
}
{
print > (outputFile)
prev=
}
'
解释: 简单的解释是:首先用第 1 列对 Input_file 进行排序,并将其输出作为输入发送到 awk
命令。然后在 awk
程序中:根据 OP 的需要将 outputFile 名称设置为 p004,第一列名称附加 .txt 并在后端关闭输出文件以避免“打开的文件太多”错误,这是每次第一次完成列正在更改(不等于其上一行的值)。然后将每一行打印到输出文件中,并将 prev 值设置为每行中的第一列值。