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
必须这样更改的文件名为filep004.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
但它不起作用