使用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
答案 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