Bash

解析文件中的標頭並根據標頭替換文件中的值

  • November 17, 2018

我有以下文件

Field1|Field2|Field3|Field4|Field5
a|b|c|d|e
1|2|3|4|5
z|y|x|w|v

我有一個接受兩個輸入的腳本

script.sh Field3 T

script.sh 將採用“Field3”參數,並根據該列號將內容替換為“T”。

$$ edit $$ 我嘗試了@Costas 的以下建議並遇到了問題。我的文件是這樣的:

MODULE_ColumnA~MODULE_ColumnB~MODULE_ColumnC~MODULE_ColumnD~MODULE_ColumnE
8.2~Y~N~~0

如果我執行以下腳本

cat <filename> | awk -F'~' -v p='MODULE_ColumnD' -v r='99' 'NR==1{for (i=1;i<=NF;i++) if($i==p)f=i;print;next}$f=r'

它替換了值,但分隔符失去或替換為輸出中的空格,如下所示:

MODULE_ColumnA~MODULE_ColumnB~MODULE_ColumnC~MODULE_ColumnD~MODULE_ColumnE
8.2 Y N 99 0

如何取回記錄中的分隔符?

awk -F'|' -v p='Field3' -v r='T' '
   NR==1{
       for (i=1;i<=NF;i++)
           if ($i==p)
              f=i
       print
       next}
   $f=r
'

如果您想將其格式化為使用,請按如下方式script.awk保存:

#!/usr/bin/awk -f
BEGIN{
   OFS=FS="|"}
NR==1{
   for (i=1;i<=NF;i++)
       if ($i==p)
           f=i
   print
   next}
$f=r

並使其可執行chmod +x script.awk並使用:

./script.awk p=Field4 r=T input.file

引用自:https://unix.stackexchange.com/questions/188418