我想使用 awk 來匹配一個大檔案中所有出現的模式。對于每場比賽,我想列印行號和沿行的模式的起始位置(xy 坐標排序)。每行中出現多次該模式。我發現了這個有點相關的問題。
到目前為止,我只為每行中的第一個(最左邊)出現做到了這一點。舉個例子:
echo xyzABCdefghiABCdefghiABCdef | awk 'match($0, /ABC/) {print NR, RSTART } '
結果輸出是:
1 4
但我期望的是這樣的:
1 4
1 13
1 22
我嘗試使用拆分而不是匹配。我設法識別所有事件,但 RSTART 丟失并列印為“0”。
echo xyzABCdefghiABCdefghiABCdef | awk ' { split($0,t, /ABC/,m) ; for (i=1; i in m; i ) print (NR, RSTART) } '
輸出:
1 0
1 0
1 0
任何意見,將不勝感激。我不限于使用 awk,但 awk 解決方案將不勝感激。此外,在我的情況下,要匹配的模式將是正則運算式 (/AC/)。謝謝
uj5u.com熱心網友回復:
使用您顯示的示例,請嘗試以下awk代碼。
awk '
{
prev=0
while(match($0,/ABC/)){
$0=substr($0,RSTART RLENGTH)
print FNR,prev RSTART
prev =RSTART 2
}
}
' Input_file
說明:為上述添加詳細說明。
awk ' ##Starting awk program from here.
{
prev=0 ##Setting prev variable to 0 here.
while(match($0,/ABC/)){ ##Using while loop to match ABC string and it runs till ABC match is ture in current line.
$0=substr($0,RSTART RLENGTH) ##Re-creating current line by assigning value of rest of line(which starts after match of ABC).
print FNR,prev RSTART ##Printing line number along with prev RSTART value here.
prev =RSTART 2 ##Setting prev to prev RSTART 2 here.
}
}
' Input_file ##Mentioning Input_file name here.
uj5u.com熱心網友回復:
用 確定字串的坐標awk:
echo "xyzABCdefghiABCdefghiABCdef" \
| awk -v s="ABC" 'BEGIN{ len=length(s) }
{
for(i=1; i<=length($0); i ){
if(substr($0, i, len)==s){
print NR, i
}
}
}'
輸出:
1 4 1 13 1 22
一行:
echo xyzABCdefghiABCdefghiABCdef | awk -v s="ABC" 'BEGIN{ len=length(s) } { for(i=1; i<=length($0); i ){ if(substr($0,i,len)==s) { print NR,i } } }'
資料來源:用 awk 查找字符的位置
uj5u.com熱心網友回復:
這可能是你想要做的:
echo xyzABCdefghiABCdefghiABCdef |
awk '{ begpos=1
while (match(substr($0, begpos), /ABC/)) {
print NR, begpos RSTART - 1
begpos = RLENGTH RSTART - 1
}
}'
uj5u.com熱心網友回復:
使用結果的一個awk想法split()和一些切片-n-dicing length():
ptn='ABC'
echo xyzABCdefghiABCdefghiABCdef |
awk -v ptn="${ptn}" '
{ pos=-(length(ptn)-1)
n=split($0,arr,ptn)
for (i=1;i<n;i ) {
pos =length(arr[i] ptn)
print NR,pos
}
}'
這會產生:
1 4
1 13
1 22
uj5u.com熱心網友回復:
另一個使用選項gnu awk可能是使用帶有正則運算式的拆分。
使用split函式,第三個欄位是fieldsep陣列,第四個欄位是seps可以用來計算位置的陣列。
echo xyzABCdefghiABCdefghiABCdef |
awk ' {
n=split($0, a, /ABC/, seps); pos=1
for(i=1; i<n; i ){
pos = length(a[i])
print NR, pos
pos = length(seps[i])
}
}'
輸出
1 4
1 13
1 22
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/422216.html
標籤:
