0

UNIX シェル スクリプト awk を使用してテキスト ファイルからいくつかの行を抽出する方法。

例 1) 入力: file_name_test.txt

**<header> asdfdsafdsf**  
11 asd sad
12 sadf asdf
13 asdfsa asdf
14 asd sdaf
**15 asd asdfsdf
16 sadfsadfsaf sdfsdf
17 asdf sdaf
18 asfd saf
19 sadf asdf
10 asf asf**

2) 期待される出力:

**<header> asdfdsafdsf
15 asd asdfsdf
16 sadfsadfsaf sdfsdf
17 asdf sdaf
18 asfd saf
19 sadf asdf
10 asf asf**

3) test.sh のコード:

FILENAME=$1
threshold=$2
awk '{line_count++;
if (line_count==1 || (line_count>$threshold))
print $0;
}' $FILENAME > overflow_new2

4)

sh test.sh file_name_test.txt 5

5) 次の最初の行のみを出力します。

<header> asdfdsafdsf

出力ファイル overflow_new2 で。これらの行をパテで返します。

awk: Field $() is not correct.
The input line number is 2. The file is file_name_test.txt
The source line number is 2.

何か案が?ありがとうございました。

4

3 に答える 3

1

最初にスクリプトを修正させてください。

#!/bin/bash
FILENAME=$1
THRESHOLD=$2

awk -v t=$THRESHOLD '{
        lc++;
        if (lc == 1 || lc > t) {
                print $0;
        }
}' $FILENAME
于 2012-12-03T11:29:23.620 に答える
0

グレン・ジャックマンのソリューションに似たPerlコードは次のとおりです。

perl -slne 'print if $. == 1 or $. >= $n' -- -n=15 

$.行番号です

于 2015-09-14T22:46:33.010 に答える
0

awkシェル変数をusing-vフラグに渡す必要があります。

filename=$1
threshold=$2

awk -v thres="$threshold" '
    { line_count++ }
    line_count==1 || line_count > thres { print }
' $filename > overflow_new2

次のように実行すると:

./script.sh file_name_test.txt 5

の結果/内容overflow_new2:

**<header> asdfdsafdsf**  
**15 asd asdfsdf
16 sadfsadfsaf sdfsdf
17 asdf sdaf
18 asfd saf
19 sadf asdf
10 asf asf**

また、目的の結果を正確に再現するには、次のようにします。

filename=$1
threshold=$2

awk -v thres="$threshold" '
    FNR == 1 {
        sub(/**\s*$/,"")
        print
    }
    FNR > thres {
        sub(/^**/,"")
        print
    }
' $filename > overflow_new2
于 2012-12-03T11:30:19.170 に答える