【问题标题】:Replace column values with certain row values for multiple files using awk/sed使用 awk/sed 将列值替换为多个文件的某些行值
【发布时间】:2019-01-11 16:21:42
【问题描述】:

我想:

  • 使用awk 或sed 将列值替换为某些行值
  • 如下所述,在循环中对多个 csv 文件执行此操作。

文件1.csv:

A,B,C,D
E,F,G,H

文件2.csv:

XYZ, 123
QWE, 456

想要更换:

  • 文件 1 中的第 2 列,文件 2 中具有 [第 1 行第 1 列] 值
  • 和文件 1 中的第 3 列,文件 2 中的 [第 1 行的第 2 列] 值

得到如下输出:

A,XYZ,123,D
E,XYZ,123,D

必须对多个文件执行此操作,第二个文件如下所示:

R,W,O,P
S,D,I,L

会改变如下...

R,QWE,456,P
S,QWE,456,L

让我知道如何使用awk 并循环执行此操作

  1. 我尝试如下,但它不起作用(awk):

    awk 'FNR==NR{a[NR]=$1;next}{$2=a[FNR]}1' file2.csv file1.csv
    
  2. 我还尝试在文件目录上循环运行此awk:

    for file in transmaster*.csv
    do
      echo $file
      awk 'FNR==NR{a[NR]=$1;next}{$2=a[FNR]}1' file2.csv file1.csv
    
    done
    

...但出现以下错误:

awk: fatal: cannot open file `file' for reading (No such file or directory)

【问题讨论】:

  • 总是在你的帖子发布一段时间后尝试选择一个答案,当有足够的答案作为正确答案时,也可以完全关闭线程。
  • 通过查看您的个人资料,了解到有时您没有选择正确的答案,请在您提出问题后的某个时间给出,然后当您看到一些答案时,您可以投票对于所有有用的答案并选择一个答案作为正确答案以鼓励爱好者程序员在这里,请参阅此链接以获取更多信息stackoverflow.com/help/someone-answers欢呼。

标签: bash unix awk sed


【解决方案1】:

请您尝试以下操作:

awk '
FNR==NR{
  a[FNR,1]=$1
  a[FNR,2]=$2
  next
}
{
  $2=a[FNR,1]
  $3=a[FNR,2]
}
1' FS=", " file2.csv  FS="," OFS="," file1.csv

【讨论】:

  • Ravinder,感谢您的回复。它的工作,但只是部分。如上所述,我有一堆 CSV 文件,对于每个文件,我想用文件 2 中的 [1st column OF 1st row] 值替换 - 文件 1 中的第 2 列 - 并将文件 1 中的第 3 列替换为 [第 1 列的第 2 列行] 文件 2 中的值 所以对于第一个 CSV,我使用来自文件 2 的第 1 行值对于第 2 个 CSV,我使用来自文件 2 的第 2 行值......等等。
猜你喜欢
  • 2018-05-24
  • 2020-01-17
  • 1970-01-01
  • 1970-01-01
  • 2016-12-05
  • 2014-09-08
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多