我有一個非常大的文本檔案,有 2 列和 10 多行。大多數行在第 2 列中都有一個數字,該數字是前一行的第 2 列的編號 1。然而,幾千行的行為不同(見下面的例子)。
輸入檔案:
A 1
A 2
A 3
A 10
A 11
A 12
A 40
A 41
我想提取不尊重第 2 列中 1 增量的兩行。
所需的輸出檔案:
A 3
A 10
A 12
A 40
是否有(優先)允許這樣做的 awk 命令?我嘗試了幾個比較兩個連續行的第 2 列的代碼,但不幸的是我到現在都失敗了(請參見下面的代碼)。
awk 'FNR==1 {print; next} $2==p2 1 {print p $0; p=""; next} {p=$0 ORS; p2=$2}' input.txt > output.txt
謝謝你的幫助。最好的,
uj5u.com熱心網友回復:
請您嘗試以下方法:
awk 'NR>1 {if ($2!=p2 1) print p ORS $0} {p=$0; p2=$2}' input.txt > output.txt
輸出:
A 3
A 10
A 12
A 40
- 變數名稱與您的相似:
p保存上一行并p2保存上一行的第二列。 - 條件
NR>1禁止在第一行列印。 if ($2!=p2 1) print p ORS $0列印滿足條件的兩行對。- 該塊
{p=$0; p2=$2}為下一次迭代保留當前行的值。
uj5u.com熱心網友回復:
我喜歡 perl 用于需要算術的文本處理。
$ perl -ane 'print and next if $.<3; print $p and print if $F[3]!=$fp 1; $fp=$F[3]; $p=$_' input.txt
| COLUMN 1 | COLUMN 2 |
| -------- | -------- |
| A | 3 |
| A | 10 |
| A | 12 |
| A | 40 |
- 這是
-a用于自動拆分為@F. - 列印前 2 行:
print and next if $.<3 - 在后續行中,如果第 4 個欄位不比前面的第 4 個欄位多一個,則列印上一行和當前行:
print $p and print if $F[3]!=$fp 1 - 將第 4 個欄位另存為
$fp,整行另存為$p:$fp=$F[3]; $p=$_
uj5u.com熱心網友回復:
假設:
- 列是制表符分隔的
- 第一列可能包含空格(這在 OP 提供的示例中沒有展示,但也沒有被排除)
- 感興趣的行在第一列中必須具有相同的值(即,如果第一列中的值不同,那么我們不必費心比較第二列中的值,而是繼續下一個輸入行)
- 如果連續 3 行符合條件,則第 2 行/中間行僅列印一次
設定:
$ cat input.txt
A 1
A 2
A 3 # match
A 10 # match
A 11
A 12 # match
A 23 # match
A 40 # match
A 41
X to Z 101
X to Z 102 # match
X to Z 104 # match
X to Z 105
注意:僅在此處添加注釋以突出顯示與搜索條件匹配的行
一個awk想法:
awk -F'\t' '
FNR==1 { prevline=$0 }
FNR>1 { if ($1 == prev1 && $2 0 != prev2 1) {
if (prevline) print prevline
print
prevline="" # make sure this line is not printed again if next line also meets criteria
}
else
prevline=$0
}
{ prev1=$1; prev2=$2 }
' input.txt
這會產生:
A 3
A 10
A 12
A 23
A 40
X to Z 102
X to Z 104
uj5u.com熱心網友回復:
這可能對您有用(GNU sed):
sed -nE 'N;h
s/.*\s (.*)\n.*(\s.*)/echo "$((\1 1))\2"/e;/^(.*)\s\1$/!{x;p;x};x;D' file
在檔案的整個長度上打開一個兩行視窗。
復制視窗并將第一行的第二列增加一。如果這個修改后的值等于第二行的第 2 列,則列印兩行未摻雜的行。
洗掉第一行并重復。
注意 如果以下行符合相同的標準,這可能會列印這些行中的第二行兩次。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/461200.html
上一篇:SSH命令將輸出保存在特定目錄中
下一篇:JavaCC參考程式正在回圈
