簡體   English   中英

awk 內聯命令和完整腳本有不同的輸出

[英]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 的總和以打印空格數。 為什么它會打印它,因為RSTARTRLENGTHawk默認變量,當找到正則表達式匹配時會設置它。

在根據划艇建議的第二個解決方案中,只需打印 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.

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