[英]awk Print Line Issue
我現在遇到了awk
命令的一些問題。 原始腳本是在MacOS上使用awk
開發的,然后移植到Linux。 awk
顯示了不同的行為。
我想要做的是計算文件/tmp/test.txt
通過/tmp/test.uniq.txt
提供的單個字符串的出現次數。
awk '{print $1, system("cat /tmp/test.txt | grep -o -c " $1)}' /tmp/test.uniq.txt
Mac提供了預期的輸出,如:
test1 2
test2 1
輸出在一行中,sting和出現次數由空格分隔。
Linux提供如下輸出:
2
test1 1
test2
輸出不在一行中,首先打印系統命令的輸出。
示例輸入:test.txt如下所示:
test1 test test
test1 test test
test2 test test
test.uniq.txt看起來像:
test1
test2
它看起來好像你正在嘗試計算uniq
文件中包含每個唯一字符串的行數。 但你正在做的方式是......尷尬,正如你所證明的那樣,awk版本之間存在不一致。
以下可能會更好一點:
$ awk '
NR==FNR {
a[$1]
next
}
{
for (i in a) {
if ($1~i) {
a[i]++
}
}
}
END {
for (i in a)
printf "%6d\t%s\n",a[i],i
}
' test.uniq.txt test.txt
2 test1
1 test2
這會將您的uniq
文件加載到一個數組中,然后對於文本文件中的每一行,逐步執行數組以計算匹配。
請注意,這些是作為正則表達式進行比較,沒有字邊界,因此test1
也將被計為test12
一部分。
另一種方法可能是使用grep
+ sort
+ uniq
:
grep -o -w -F -f uniq.txt test.txt | sort | uniq -c
這是一條管道但很短的管道
從man grep
:
-F
, ---fixed-strings
, ---fixed-regexp
PATTERN解釋為固定字符串列表,由換行符分隔,其中任何一個都要匹配。 (-F
由POSIX指定, ---fixed-regexp
是廢棄的別名,請不要在新腳本中使用它。)-f FILE
, ---file=FILE
從FILE獲取模式,每行一個。 空文件包含零模式,因此不匹配任何內容。 (-f
由POSIX指定。)-o
, ---only-matching
僅打印匹配行的匹配(非空)部分,每個此類部分位於單獨的輸出行上。-w
, ---word-regexp
僅選擇包含構成整個單詞的匹配項的行。 測試是匹配的子字符串必須位於行的開頭或前面是非單詞構成字符。 同樣,它必須位於行的末尾或后跟非單詞構成字符。 單詞構成字符是字母,數字和下划線。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.