我有一個文本檔案,我想在每次連續出現兩個詞的時候翻閱并列出每個計數。
示例輸入:
我是一個人
期望的輸出:
1 I am
1是一個
1個男人
我是這樣想的:
cat $1 | sed "s/ /g" | "s/
/g" | read word1 &&
while read word2。
do
echo "$word1 $word2"/span>;
word1=word2。
done
但這得到了一個無限的回圈。希望得到任何幫助!
uj5u.com熱心網友回復:
在while條件中呼叫read兩次。
while read line1; read line2; do>
echo "$line1 $line2"/span>
done << EOF
1
a
2
b
EOF
將輸出
1 a
2 b
當第二個讀取失敗時,回圈退出,即使第一個成功了。如果你想執行主體(即使是空的line2),將read line2移到回圈的主體中。
uj5u.com熱心網友回復:
使用bash:
set -f # for slurping in the words of the file, we want word splitting
# 但不是glob擴展。
words=( $(< "$1" )
for ((i = 1; i < ${#words[@]}; i )); do
printf "%s%s
" "${words[i-1]}"/span> "${words[i]}"
done
鑒于@chepner的輸入檔案,這個輸出
1 a
a 2
2 b
重寫你的代碼:你需要一個分組結構,以便所有的reads都是從同一個資料管道中讀取。
tr -s '[:space:]' '
' < "$1"| {
IFS= 讀 -r word1
while IFS= read -r word2; do
echo "$word1 $word2"/span>
word1=$word2
done
}
對于計數來說,最簡單的方法是將輸出的資料匯入| sort | uniq -c
。
通過@markp-fuso的words.dat檔案,這兩種解決方案的輸出結果是
3 我是
3 一個人
2是一個
1人不是
2個男人 I
1不是一個
計數可以在bash中使用關聯陣列來完成:
declare -A pairs
for ((i = 1; i < ${#words[@]}; i )); do
key="${words[i-1]} ${words[i]}"/span>
pairs[$key]=$( ( pairs[$key] 1 )
完成了。
for key in "${!pair[@]}"; do>
printf "}%s
" "${pairs[$key]}" "$key"
done
1 not a
3個男人
1不是
2 我是一個
3 我是
2個男人我
uj5u.com熱心網友回復:
假設:
- 計數是在整個檔案中累積的(而不是為每一個新的行重新開始計數)
- 詞對可以跨行,例如,
一個 字與一個字相同。
- 我們只對2個字的配對感興趣,也就是說,不需要為動態的字數編碼(例如,3個字,4個字)
示例輸入資料:
$ cat words.dat
我是一個男人
我不是男人 我
是一個人
一個awk想法:
$ awk -v RS='' ' # 把檔案當作一個很長的單一記錄
{ for (i=1;i<NF;i ) # 回圈瀏覽欄位串列 1 - (NF-1)
count[$(i)" "$(i 1)] # 使用欄位i和i 1作為陣列索引
}
END { for (i in count) # 回圈瀏覽陣列索引
print count[i],i
}
' words.dat
這就產生了:
2 am a
3個男人
1 我不是
3 我是
1不是一個
2個男人我
注意:沒有說明排序要求,否則我們可以用管道將結果送到sort,或者如果使用GNU awk,我們也許可以添加一個適當的PROCINFO["sorted_in"]陳述句
OP的原始輸入:
$ awk -v RS='' '{for (i=1; i<NF;i ) count[$(i)" "$(i 1)] } END {for (i in count) print count[i],i}' <<< "我是個男人"
1是一個
1個男人
1 我是
移除關于動態字數的假設 ......
$ awk -v wcnt=2 -v RS='' ' # <word_count> = 2; 將檔案視為一條很長的單一記錄
NF>=wcnt { for (i=1;i<=(NF-wcnt 1);i ) { # 回圈瀏覽欄位串列 1 - (NF-<word_count> )
pfx=key=""
for (j=0;j<wcnt;j ) { # 從<word_count>欄位建立count[]索引
key=key pfx $(j i)
pfx=" "
}
count[key]
}
}
END { for (i in count) # 回圈瀏覽陣列索引
print count[i],i
}
' words.dat
用-v wcnt=2:
2 am a
3個男人
1 我不是
3 我是
1不是一個
2個男人我
用-v wcnt=3:
1 不是男人
2 我是一個
1 我不是
2 我是男人
2我是一個人
2個男人我
1不是一個
用-v wcnt=5:
1 I am a man I
1 我不是一個男人
1 我不是男人
1 我是一個男人 我是
1個男人,我是個男人
1個男人,我不是一個
1個男人,我不是
1不是一個男人我是
1個男人,我是一個
用-v wcnt=3和awk '...' <<< "我是個男人":
1 I am a
1我是個男人
用-v wcnt=5和awk '...' <<< "我是一個人":
# no output since less than wcnt=5 words to work with。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/318101.html
標籤:
上一篇:在JenkinsWindowsSlave上克隆GitRepo時出現錯誤
下一篇:使用awk在檔案的開頭添加列
