簡體   English   中英

awk打印行問題

[英]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

由於評論建議不建議使用grepcat等使用system函數,因為awk是可以執行大部分這些任務的完整語言。

您可以使用以下awk命令替換您的cat | grep cat | grep功能:

awk 'FNR == NR {a[$1]=0; next} {for (i=1; i<=NF; i++) if ($i in a) a[$i]++} 
END { for (i in a) print i, a[i] }' uniq.txt test.txt

test1 2
test2 1

請注意,此輸出與計數5不匹配,因為您的樣本數據可能不同。


參考文獻:

它看起來好像你正在嘗試計算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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM