Linux bash在文件中查找列,并使用awk或sed追加2列数据

xtfmy6hx  于 2023-02-11  发布在  Linux
关注(0)|答案(2)|浏览(152)

根据评论,以下是简化要求。需要更新以下输入日志文件,每天执行后获得实际数字,这将添加为预期旁边的第4列,run_id将添加为日期后的第2列。对日期执行grep将显示以下行,我正在尝试使用"|"(管道)分隔符。
总结一下:每当执行时,需要更新日志文件(每次执行更新一次)

日志文件内容

| 日期|预期|
| - ------|- ------|
| 二○二二年十一月一日|一百|
| 二○二二年十一月二日|二百|

运行脚本变量数据

|运行日期:2022年11月1日||运行ID:2211||实际计数:102|
如果我将其放置在文件中以使用Linuxjoin实用程序,则文件内容如下所示,或者我可以使用由所有3个值分隔的变量管道

    • 2001年11月22日|小行星2211|102人**

1次执行后更新的日志文件内容将

| 日期|运行标识|预期|实际的|
| - ------|- ------|- ------|- ------|
| 二○二二年十一月一日|小行星2211|一百|一百零二|
| 二○二二年十一月二日|二百|||
尝试通过将变量值保存在单独的文件中并进行联接以获得4列输出来使用联接,但对于一次一个值来说,这似乎不是最佳解决方案。我不想为使用联接而累积此运行信息,而是希望在运行时使用。
join -a 2 -1 1 -2 1 -t\| -o 2.1,2.2,1.2,1.3 <(sort actual.txt) <(sort expected.txt)

iq3niunx

iq3niunx1#

我能够使用awk得到想要的结果:

awk -F"|" -v expct="102" -v dt="2022-11-01" -v runid="111111" '$1==dt {$((NF+1)-1)=runid FS $2 FS expct ;}1' OFS="|" tstexecn.txt
2022-11-01|111111|934465|102
2022-11-02|888416
33qvvth1

33qvvth12#

作为Nic 3500,* 你的问题几乎是胡言乱语
此外,除非您非常喜欢数据库编程,(并且您的头脑清楚地了解这种方法/心态,否则我个人建议避免使用“连接”。
我做了一些假设,并使用awk创建了一个脚本(
这实际上是为这类工作设想的 *),以解决这些假设

  • 您有一个引用文件(${jobcontrol},格式与脚本相同),其中包含每个日期运行的期望值列表。
  • 您有一个作业运行日志(${runtimedat},格式与脚本相同),其中报告了每个日期运行的实际值。
  • 您正在尝试将两组表格数据“混合”到一个最终报告表格中。

如果删除所有带有“dbg == 1”的行,那么最终得到的是一个相当精简和简单的脚本。

剧本:

#!/bin/bash

jobcontrol="table.csv"

cat >"${jobcontrol}" <<"EnDoFiNpUt"
date|expected
2022-11-01|100
2022-11-02|200
EnDoFiNpUt

runtimedat="run.log"

cat >"${runtimedat}" <<"EnDoFiNpUt"
2022-11-01|2211 actual count : 102
2022-11-02|2214 actual count : 199
EnDoFiNpUt

awk -v tabdiv="" -v dbg=1 -v job="${jobcontrol}" 'BEGIN{
    ## Initial loading of the report reference index file into an array for tabulation
    split( "", report );
    indexR=0 ;
    wf1=0 ;
    wf2=0 ;
    wf3=0 ;
    wf4=0 ;
    if( dbg == 1 ){ printf("\n\t --- %s\n", "PHASE 1" ) | "cat >&2" ; } ;
    while( getline < job ){
        indexR++ ;
        split( $0, datline, "|" );
        if( dbg == 1 ){ printf("\n\t --- %s\n", $0 ) | "cat >&2" ; } ;

        report[indexR,1]=datline[1] ;
        if( dbg == 1 ){ printf("\t --- datline[1] = %s\n", datline[1] ) | "cat >&2" ; } ;
        wf1n=length(datline[1]) ; if( wf1n > wf1 ){ wf1=wf1n ; } ;
        if( dbg == 1 ){ printf("\t --- wf1n = %s    wf1 = %s\n", wf1n, wf1 ) | "cat >&2" ; } ;

        report[indexR,3]=datline[2] ;
        if( dbg == 1 ){ printf("\t --- datline[2] = %s\n", datline[2] ) | "cat >&2" ; } ;
        wf3n=length(datline[2]) ; if( wf3n > wf3 ){ wf3=wf3n ; } ;
        if( dbg == 1 ){ printf("\t --- wf3n = %s    wf3 = %s\n", wf3n, wf3 ) | "cat >&2" ; } ;

        if( indexR == 1 ){
            report[indexR,2]="run_id" ;
            if( dbg == 1 ){ printf("\t --- report[indexR,2] = %s\n", report[indexR,2] ) | "cat >&2" ; } ;
            wf2n=length(report[indexR,2]) ; if( wf2n > wf2 ){ wf2=wf2n ; } ;
            if( dbg == 1 ){ printf("\t --- wf2n = %s    wf2 = %s\n", wf2n, wf2 ) | "cat >&2" ; } ;

            report[indexR,4]="actual" ;
            if( dbg == 1 ){ printf("\t --- report[indexR,4] = %s\n", report[indexR,4] ) | "cat >&2" ; } ;
            wf4n=length(report[indexR,4]) ; if( wf4n > wf4 ){ wf4=wf4n ; } ;
            if( dbg == 1 ){ printf("\t --- wf4n = %s    wf4 = %s\n", wf4n, wf4 ) | "cat >&2" ; } ;
        } ;
    } ;

    if( dbg == 1 ){ printf("\n\t --- %s %s %s %s\n", wf1, wf2, wf3, wf4 ) | "cat >&2" ; } ;

    if( dbg == 1 ){ printf("\n\t --- %s\n", "PHASE 2" ) | "cat >&2" ; } ;
}
{
    ## Matching run logs with reference table for data collection and table update with latest results

    # 2022-11-01|2211 actual count : 102
    split( $0, lindat, "|" ) ;
    when=lindat[1] ;

    split( lindat[2], logdat ) ;
    for( i=2 ; i<=indexR ; i++ ){
        if( when == report[i,1] ){
            # 2211 actual count : 102
            report[i,2]=logdat[1] ;
            if( dbg == 1 ){ printf("\n\t --- logdat[1] = %s\n", logdat[1] ) | "cat >&2" ; } ;
            wf2n=length(logdat[1]) ; if( wf2n > wf2 ){ wf2=wf2n ; } ;

            report[i,4]=logdat[5] ;
            if( dbg == 1 ){ printf("\t --- logdat[5] = %s\n", logdat[5] ) | "cat >&2" ; } ;
            wf4n=length(logdat[5]) ; if( wf4n > wf4 ){ wf4=wf4n ; } ;

            if( dbg == 1 ){ printf("\t --- %s %s %s %s\n", wf1, wf2, wf3, wf4 ) | "cat >&2" ; } ;
        } ;
    } ;
}
END{
    # Print final form of collected and updated table

    fmt=" %-10s "tabdiv" %"wf2"s "tabdiv" %"wf3"s "tabdiv" %"wf4"s\n" ;
    printf(fmt, report[1,1], report[1,2], report[1,3], report[1,4] ) ;

    fmt=" %-10s "tabdiv" %"wf2"d "tabdiv" %"wf3"d "tabdiv" %"wf4"d\n" ;
    for( i=2 ; i<=indexR ; i++ ){
        printf(fmt, report[i,1], report[i,2], report[i,3], report[i,4] ) ;
    } ;
}' "${runtimedat}"

会话日志如果运行时没有删除硬编码调试标志:

--- PHASE 1

     --- date|expected
     --- datline[1] = date
     --- wf1n = 4    wf1 = 4
     --- datline[2] = expected
     --- wf3n = 8    wf3 = 8
     --- report[indexR,2] = run_id
     --- wf2n = 6    wf2 = 6
     --- report[indexR,4] = actual
     --- wf4n = 6    wf4 = 6

     --- 2022-11-01|100
     --- datline[1] = 2022-11-01
     --- wf1n = 10    wf1 = 10
     --- datline[2] = 100
     --- wf3n = 3    wf3 = 8

     --- 2022-11-02|200
     --- datline[1] = 2022-11-02
     --- wf1n = 10    wf1 = 10
     --- datline[2] = 200
     --- wf3n = 3    wf3 = 8

     --- 10 6 8 6

     --- PHASE 2

     --- logdat[1] = 2211
     --- logdat[5] = 102
     --- 10 6 8 6

     --- logdat[1] = 2214
     --- logdat[5] = 199
     --- 10 6 8 6

 date       | run_id | expected | actual
 2022-11-01 |   2211 |      100 |    102
 2022-11-02 |   2214 |      200 |    199

如果使用“dbg=0"修改脚本,则简单输出如下:

root:/0__WORK$ ./test_153.sh
 date       | run_id | expected | actual
 2022-11-01 |   2211 |      100 |    102
 2022-11-02 |   2214 |      200 |    199
root:/0__WORK$

...与指定的完全相同,带有竖线。要消除竖线,请设置“tabdiv=""“,然后您会得到

root:/0__WORK$ ./test_153.sh
 date        run_id  expected  actual
 2022-11-01    2211       100     102
 2022-11-02    2214       200     199
root:/0__WORK$

相关问题