Awk 如何使用bash使用特定列中的值从一个文件保存不同的文件

Awk 如何使用bash使用特定列中的值从一个文件保存不同的文件,awk,match,multiple-columns,newline,Awk,Match,Multiple Columns,Newline,我想使用列$1中的值保存行,并使用$1中的值将行保存到一个文件中,如果该行具有不同的值,请将其保存到另一个新文件中 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

我想使用列
$1
中的值保存行,并使用
$1
中的值将行保存到一个文件中,如果该行具有不同的值,请将其保存到另一个新文件中

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 
必须这样更改的文件名为file
p004.txt p005.txt
我试过这样做
'ls p???txt | sed“s/.txt//g”中i的
;doawk'{file=${i}$1.txt“print>>file}'${i}.txt;完成
但它不起作用:(有人能从这个问题中找到解决方案吗?

感谢您使用所显示的示例,请尝试以下操作。虽然您的示例显示为已排序的第1列,但我仍然使用
排序
将文件排序为第1列,如果您的整个文件已排序为第1列,请从下面删除排序命令,并在
awk
程序末尾粘贴
输入文件
m

sort -k1 Input_file | awk 'prev!=$1{close(outputFile);outputFile=("p004"$1".txt")} {print > (outputFile);prev=$1}' 
或上述解决方案的非线性形式:

sort -k1 Input_file | 
awk '
  prev!=$1{
    close(outputFile)
    outputFile=("p004"$1".txt")
  }
  {       
    print > (outputFile)
    prev=$1
  }
'  

解释:简单的解释是:首先用第1列对输入文件进行排序,并将其输出作为输入发送到
awk
命令。然后在
awk
程序中:将outputFile name设置为p004,并根据OP的需要将第1列名称附加.txt,然后在后端关闭输出文件以避免“打开的文件太多”错误,每次更改第一列时都会执行此操作(不等于前一行的值)。然后将每行打印到输出文件中,并将prev value设置为每行的第1列值。

对于所显示的示例,请尝试以下操作。虽然您的示例显示为已排序的第1列,但我仍然使用
排序
将文件排序为第1列,如果您的整个文件已按第1列排序,请删除排序命令从下面开始,将
Input_file
粘贴到
awk
程序的末尾

sort -k1 Input_file | awk 'prev!=$1{close(outputFile);outputFile=("p004"$1".txt")} {print > (outputFile);prev=$1}' 
或上述解决方案的非线性形式:

sort -k1 Input_file | 
awk '
  prev!=$1{
    close(outputFile)
    outputFile=("p004"$1".txt")
  }
  {       
    print > (outputFile)
    prev=$1
  }
'  

解释:简单的解释是:首先用第一列对输入文件进行排序,并将其输出作为输入发送到
awk
命令。然后在
awk
程序中:将outputFile name设置为p004,并根据OP的需要将第一列名称附加.txt,并在后端关闭输出文件,以避免““打开的文件太多”错误,每次更改第一列时都会执行此操作(不等于其前一行的值)。然后将每行打印到输出文件中,并将prev值设置为每行的第一列值。

我已尝试
在'ls p???sed“s/.txt//g';粘贴${i}.txt| awk'prev!=$1{close(outputFile);outputFile=(${i}“$1.txt”){print>(outputFile);prev=$1};done
但它仍然是错误的我在ls p中尝试了
,sed“s/.txt//g`;确实粘贴${i}.txt{awk'prev!=$1{close(outputFile);outputFile=(${i}”{1.txt”){print>(outputFile);prev=$1}“;完成了
,但仍然是error@RETNOEKA YUNI P,请务必让我知道您在哪个文件上运行它。我将在所有文件上运行它,如文件
p004.txt、p005.txt和其他文件
。但是,如果我使用您的脚本运行,我必须逐个运行。我已尝试使用
for
但没有work@RETNOEKA YUNI P,请告诉我您正在运行哪个文件。我将在所有文件上运行它,如文件
p004.txt、p005.txt和其他文件
。但是,如果我使用您的脚本运行,我必须逐个运行。我尝试使用
for
但它不起作用