[英]awk inline command and full script has different output
我想計算行首的起始空格數。 我的示例文本文件如下
aaaa bbbb cccc dddd
aaaa bbbb cccc dddd
aaaa bbbb cccc dddd
aaaa bbbb cccc dddd
現在,當我編寫一個簡單的腳本來計數時,我注意到內聯命令和awk
輸出的完整腳本之間的不同。
#!/bin/bash
while IFS= read -r line; do
echo "$line" | awk '
{
FS="[^ ]"
print length($1)
}
'
done < "tmp"
輸出是
4
4
4
4
#!/bin/bash
while IFS= read -r line; do
echo "$line" | awk -F "[^ ]" '{print length($1)}'
done < "tmp"
輸出是
0
2
4
0
我想編寫一個具有內聯類型輸出的完整腳本。
有人能解釋一下這個不同嗎? 非常感謝。
您能否在不更改FS
情況下嘗試以下操作。 在https://ideone.com/N8QcC8 中編寫和測試
awk '{if(match($0,/^ +/)){print RSTART+RLENGTH-1} else{print 0}}' Input_file
或嘗試:
awk '{match($0,/^ */); print RLENGTH}' Input_file
輸出將是:
0
2
4
0
說明:在第一個解決方案中,只需使用 if 和 else 條件。 在 if 部分,我使用awk
match
函數並在其中提供正則表達式以匹配其中的行的初始空格。 然后打印 RSTART+RLENGTH-1 的總和以打印空格數。 為什么它會打印它,因為RSTART
和RLENGTH
是awk
默認變量,當找到正則表達式匹配時會設置它。
在根據划艇建議的第二個解決方案中,只需打印 RLENGTH,它也將負責打印 0,而不使用 if else 條件。
修復了你的第一次嘗試:
$ while IFS= read -r line; do
echo "$line" | awk '
BEGIN { # you forgot the BEGIN
FS="[^ ]" # gotta set FS before record is read
}
{
print length($1)
}'
done < file
現在輸出:
0
2
4
0
為了加快速度,只需使用 awk 即可:
$ awk '
BEGIN {
FS="[^ ]"
}
{
print length($1)
}' file
你可以試試 Perl。 只需捕獲組中的前導空格並打印其長度。 "a"=~/a/ 只是在每行的末尾重置正則表達式捕獲。
perl -nle ' /(^\s+)/; print length($1)+0; "a"=~/a/ ' count_space.txt
0
2
4
0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.