AWK命令打印说第1和第5列

时间:2015-05-13 16:42:24

标签: awk

使用Awk命令我想打印第1,第3,第5列到最后一列

示例输入文件包含:

1st line
    05/05/2015 14:10:40 [739]: indic.cxx.400: No more free context, TYPE=SINGLE^M
2nd line
    05/05/2015 14:11:21 [739]: indic.cxx.400: No more free context, TYPE=SINGLE^M
3rd line
    05/05/2015 14:14:21 [739]: indic.cxx.400: No more free context, TYPE=SINGLE^M

第1栏,即05/05/2015 第3,即[739] 我想打印从5开始到结束的所有列 即没有更多的自由语境,TYPE = SINGLE ^ M

但我想比较第5列中的每个字符串的重复项

预期输出应为:

05/05/2015 [739]: No more free context, TYPE=SINGLE^M

因为考虑到第1行的第5列,即“没有更多的自由上下文,TYPE = SINGLE ^ M”,其他2行应该只有一行

对于如上所述的打印列,此代码字为awk -F“”'{print $ 1,$ 3; for(i = 5; i< = NR; i ++)print $ i}'$ file

for i in $*
 do
  while read line
   do
     var1=`awk -F" " '{print $1}' $line`
     var2=`awk -F" " '{print $3}' $line`
     var3=`awk -F" " '{for (i=5; i<=NR; i++) print $i }' $line`
     echo "$var1 $var2 $var3"
   done
 done

2 个答案:

答案 0 :(得分:3)

让我们考虑一下这个测试文件:

$ cat file
05/05/2015 14:10:40 [739]: indic.cxx.400: No more free context, TYPE=SINGLE
05/05/2015 14:10:40 [739]: indic.cxx.400: No more free context, TYPE=SINGLE
05/05/2015 14:11:21 [739]: indic.cxx.400: No more free context, TYPE=SINGLE
05/05/2015 14:11:21 [739]: indic.cxx.400: No more free context, TYPE=SINGLE
05/05/2015 14:14:21 [739]: indic.cxx.400: No more free context, TYPE=SINGLE
05/05/2015 14:14:22 [739]: indic.cxx.400: Other Message
05/05/2015 14:14:23 [739]: indic.cxx.400: Something Else
05/05/2015 14:14:24 [739]: indic.cxx.400: Something Else

要打印字段1,3和5以在每一行上结束,除非字段5到结尾与上一行相同:

$ awk '{f="";for (i=5; i<=NF; i++) f=f" "$i;} f!=last{print $1,$3,f;} {last=f;}' file
05/05/2015 [739]:  No more free context, TYPE=SINGLE
05/05/2015 [739]:  Other Message
05/05/2015 [739]:  Something Else

如何运作

此脚本使用两个变量。 f具有从当前行的5到结尾的字段。 last与上一行的字段相同。

  • f=""; for (i=5; i<=NF; i++) f=f" "$i;

    每次我们开始一个新行时,这会将字符串变量f设置为从5到结尾的所有字段。

  • f!=last {print $1,$3,f;}

    如果f的当前值与last不同,即f!=last,则从该行打印所选字段。

    如果您想更改输出格式,请在此处调整print语句。

  • last=f;

    在我们转到下一行之前要做的最后一件事,将变量last更新为当前行f

答案 1 :(得分:2)

使用@ John1024发布的样本输入文件gawk:

    Sub DataSubtract()
Application.ScreenUpdating = False
    Dim sheet_name As Range
    Dim sheet_name2 As Range
    Dim sheet_name3 As Range
    Set sheet_name2 = Sheets("WS_QA").Range("B:B")
    Set sheet_name3 = Sheets("WS_QA").Range("C:C")

    'Counter 1
    Dim counter As Long
    counter = 1
    'Counter 2 for sheet_name3
    Dim counter2 As Long
    counter2 = 1

    'Row
    Dim r As Long

    For Each sheet_name In Sheets("WS_QA").Range("A:A")
        If sheet_name.Value = "" Then
            Exit For
        Else
            With Sheets(sheet_name.Value)
            'Column C
                For r = 14 To 39
                .Cells(r, 3).Value = Sheets(sheet_name2(counter, 1).Value).Cells(r, 3).Value - Sheets(sheet_name3(counter2, 1).Value).Cells(r, 3).Value
                counter = counter + 1
                counter2 = counter2 + 1
                Next r
            End With
        End If
    Next sheet_name
Application.ScreenUpdating = True
End Sub

和任何POSIX awk:

$ awk '{key=gensub(/^(\S+\s+){4}/,"","")} !seen[key]++{print $1, $3, key}' file
05/05/2015 [739]: No more free context, TYPE=SINGLE
05/05/2015 [739]: Other Message
05/05/2015 [739]: Something Else