如何使用 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_fileawk 程序结束时。

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 值设置为每行中的第一列值。