【问题标题】:awk replace empty fields/columns with added string and aligning themawk 用添加的字符串替换空字段/列并对齐它们
【发布时间】:2019-12-22 01:18:20
【问题描述】:

你好,我在这几个小时里一直在为此苦苦挣扎,试图从一开始就在这里找到一些解决方案,用例如替换列的空字段。不适用字符串

最初尝试跟随而不进一步获得一些预期的输出

awk -v OFS=' ' '{for (i=1;i<=NF;i++) {gsub(/^[[:space:]]+$/,"",$i); $i=($i==""?NA:$i)}; print}' file  >> not worked
awk '{for(i=1;i<=NF;i++)if($i~/*$/)$i=NA}1' file | column -t                                            >> not worked
awk 'NF==23{$0=$0"NA"}1' file
awk  'BEGIN{OFS=" "}{for(i=1;i<NF;i++){if($i==""){$i=l}else{l=$i}}print}' file
awk '{ for(i=1; i<=NF; i++) if($i ~ /^ *$/) $i = 0 }; 1' file

这是输入:

5 STAT in DOCK 3 BAY1 SHIP OK SHA OK SHB BAD SHC BAD SHD BAD SHF BAD SHG BAD SHI BAD SHJ
5 STAT in DOCK 3 BAY2 SHIP OK SHA OK SHB BAD SHC BAD SHD BAD SHF BAD SHG BAD SHI BAD SHJ
5 STAT in DOCK 5 CONT CARG OK SHI OK SHJ
5 STAT in DOCK 5 CONG CARG OK SHF OK SHG
11 STAT in DOCK 8 BAY7 SHIP BAD SHA OK SHB BAD SHC BAD SHD BAD SHF BAD SHG BAD SHI BAD SHJ
11 STAT in DOCK 8 BAY9 SHIP OK SHA OK SHB BAD SHC BAD SHD BAD SHF BAD SHG BAD SHI BAD SHJ
7 STAT in DOCK 7 CONT7 SHIP BAD SHA OK SHB BAD SHC BAD SHD BAD SHF BAD SHG BAD SHI BAD SHJ
191 STAT in DOCK 20 FRI5 CARG OK SHA BAD SHB BAD SHF BAD SHG 
1 STAT in DOCK 50 BAY4 CARGB BAD SHF OK SHG

这是目标 //预期输出1

5   STAT in DOCK 3  BAY1  SHIP  OK  SHA OK  SHB BAD SHC BAD SHD BAD SHF BAD SHG BAD SHI BAD SHJ
5   STAT in DOCK 3  BAY2  SHIP  OK  SHA OK  SHB BAD SHC BAD SHD BAD SHF BAD SHG BAD SHI BAD SHJ
5   STAT in DOCK 5  CONT  CARG  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  OK  SHI OK  SHJ
5   STAT in DOCK 5  CONG  CARG  NA  NA  NA  NA  NA  NA  NA  NA  OK  SHF OK  SHG NA  NA  NA  NA
11  STAT in DOCK 8  BAY7  SHIP  BAD SHA OK  SHB BAD SHC BAD SHD BAD SHF BAD SHG BAD SHI BAD SHJ
11  STAT in DOCK 8  BAY9  SHIP  OK  SHA OK  SHB BAD SHC BAD SHD BAD SHF BAD SHG BAD SHI BAD SHJ
7   STAT in DOCK 7  CONT7 SHIP  BAD SHA OK  SHB BAD SHC BAD SHD BAD SHF BAD SHG BAD SHI BAD SHJ
191 STAT in DOCK 20 FRI5  CARG  OK  SHA BAD SHB NA  NA  NA  NA  BAD SHF BAD SHG NA  NA  NA  NA
1   STAT in DOCK 50 BAY4  CARGB NA  NA  NA  NA  BAD NA  NA  NA  BAD SHF OK  SHG NA  NA  NA  NA

-- 删除了预期的输出 nr2,因为它令人困惑

【问题讨论】:

  • 最后一行GRB 组中的BAD 来自哪里?
  • 如果是拼写错误,那么应该可以:awk 'BEGIN{a[0]="SHA";a[1]="SHC";a[2]="SHF";a[3]="SHI"}NF&lt;23{f=9;for(f=9,i=0;i&lt;4;++i){if($f!=a[i]){$(f-1)="NA NA NA NA "$(f-1);$0=$0}f+=4}}1' file
  • hello @oguzismail BAD 与给定列中的 OK 相反,它是系统的结果,例如 GRB 只是由 SHC 和 SHD 组成的组,例如 SHC 的 BAD 或 OK 值甚至对于 SHD ,这些组不是强制性的,它只是唯一的想法,如何将它们分组以获得更好的概览,如预期格式 nr.2
  • 我明白了,我在问你预期输出中第 9 行第 12 列的“BAD”是从哪里来的?
  • @oguzismail 啊它的错字

标签: string sorting awk replace multiple-columns


【解决方案1】:
$ cat tst.awk
BEGIN {
    numFlds = split("SHA SHB SHC SHD SHF SHG SHI SHJ",fldList)
    for (i in fldList) {
        fldName = fldList[i]
        fldSet[fldName]
    }
}
{
    for (i=1; (i<=NF) && !($(i+1) in fldSet); i++) {
        printf "%s%s", $i, OFS
    }

    delete fldVals
    for (; i<=NF; i+=2) {
        fldName = $(i+1)
        fldVals[fldName] = $i
    }

    for (fldNr=1; fldNr<=numFlds; fldNr++) {
        fldName = fldList[fldNr]
        if (fldName in fldVals) {
            fldVal = fldVals[fldName]
        }
        else {
            fldName = fldVal = "NA"
        }
        printf "%s%s%s%s", fldVal, OFS, fldName, (fldNr<numFlds ? OFS : ORS)
    }
}

.

$ awk -f tst.awk file | column -t -o' '
5   STAT in DOCK 3  BAY1  SHIP  OK  SHA OK  SHB BAD SHC BAD SHD BAD SHF BAD SHG BAD SHI BAD SHJ
5   STAT in DOCK 3  BAY2  SHIP  OK  SHA OK  SHB BAD SHC BAD SHD BAD SHF BAD SHG BAD SHI BAD SHJ
5   STAT in DOCK 5  CONT  CARG  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  OK  SHI OK  SHJ
5   STAT in DOCK 5  CONG  CARG  NA  NA  NA  NA  NA  NA  NA  NA  OK  SHF OK  SHG NA  NA  NA  NA
11  STAT in DOCK 8  BAY7  SHIP  BAD SHA OK  SHB BAD SHC BAD SHD BAD SHF BAD SHG BAD SHI BAD SHJ
11  STAT in DOCK 8  BAY9  SHIP  OK  SHA OK  SHB BAD SHC BAD SHD BAD SHF BAD SHG BAD SHI BAD SHJ
7   STAT in DOCK 7  CONT7 SHIP  BAD SHA OK  SHB BAD SHC BAD SHD BAD SHF BAD SHG BAD SHI BAD SHJ
191 STAT in DOCK 20 FRI5  CARG  OK  SHA BAD SHB NA  NA  NA  NA  BAD SHF BAD SHG NA  NA  NA  NA
1   STAT in DOCK 50 BAY4  CARGB NA  NA  NA  NA  NA  NA  NA  NA  BAD SHF OK  SHG NA  NA  NA  NA

【讨论】:

    【解决方案2】:
    awk -v OFS=" " 'NR==1 {cols=NF} {$1=$1; for (i=NF+1; i <= cols; i++) $i = "NA"} 1' file
    

    好吧,如果添加了具有相同预期数量列的标题(没有提供的“虚拟”标题根本不起作用),那么这个只能以通用方式工作,仍然可以使用两个版本

    e.g.
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
    5 STAT in DOCK 5 CONT CARG OK SHI OK SHJ
    

    【讨论】:

      猜你喜欢
      • 2020-04-08
      • 1970-01-01
      • 1970-01-01
      • 2013-05-06
      • 2020-09-29
      • 2017-11-21
      • 1970-01-01
      • 1970-01-01
      • 2016-01-20
      相关资源
      最近更新 更多