【问题标题】:How to save different file from one file using value in specific column using bash如何使用bash使用特定列中的值从一个文件中保存不同的文件
【发布时间】:2021-05-16 02:40:55
【问题描述】:

我想使用$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 

必须像这样更改的文件具有名称文件p004.txt p005.txt 我试过这样
for i in `ls p????.txt|sed "s/.txt//g"`;do awk '{file=${i}$1".txt" print >> file}' ${i}.txt;done 但它不起作用:(有人有这个问题的解决方案吗?
谢谢

【问题讨论】:

  • 我试过for i in `ls p????_s.txt | sed "s/.txt//g"`; do paste ${i}.txt | awk 'prev!=$1{close(outputFile);outputFile=(${i}"_"$1".txt")} {print > (outputFile);prev=$1}';done,但还是出错

标签: awk match multiple-columns newline


【解决方案1】:

使用您展示的示例,请尝试以下操作。尽管您的样本显示为已排序的第一列,但我仍然使用sort 对具有第一列的文件进行排序,以防您的整个文件按第一列排序,然后从以下内容中删除排序命令并将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
  }
'  

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

【讨论】:

  • @RETNO EKA YUNI P,请让我知道您在哪个文件上运行它。
  • 我会在所有文件上运行它,比如文件p004.txt, p005.txt and other file。但是,如果我使用您的脚本运行,我必须一一运行。我尝试过使用for,但它不起作用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-25
  • 2015-02-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-14
相关资源
最近更新 更多