4

(たとえば)100行の「file1」があります。sed または awk を使用して、23 行目、71 行目、84 行目 (たとえば) を「file2」に出力したいと考えています。これらの 3 つの行番号は別のファイル「リスト」にあり、各番号は別の行にあります。

これらのコマンドのいずれかを使用すると、84 行目だけが出力されます。

for i in $(cat list); do sed -n "${i}p" file1 > file2; done

for i in $(cat list); do awk 'NR==x {print}' x=$i file1 > file2; done

このように for ループを使用して、ラインアドレスを sed または awk に提供できますか?

4

5 に答える 5

5

これはうまくいくかもしれません(GNU sed):

sed 's/.*/&p/' list | sed -nf - file1 >file2

スクリプトの作成に使用listします。sed

于 2013-06-11T05:56:20.070 に答える
4

>すべてをキャプチャするには、ループの後に行う必要があります。ループ内で使用しているため、ファイルが上書きされます。ループ内で行う必要があります>>

ループの外側で使用することを>お勧めします。これにより、ループの反復ごとに書き込み用にファイルが開かれなくなります。

ただし、awkなしですべてを行うことができますfor loop

awk 'NR==FNR{a[$1]++;next}FNR in a' list file1 > file2
于 2013-06-11T05:29:37.320 に答える
3

sedを使用:

 sed -n $(sed -e 's/^/-e /' -e 's/$/p/' list) input

入力例を指定すると、内部コマンドは次のような文字列を作成します。

-e 23p 
-e 71p 
-e 84p 

そのため、外側の sed は指定された行を出力します

于 2013-06-11T05:31:35.083 に答える
3

>>(ファイルに追加) する必要があります。しかし、あなたはファイルを上書きしています。そのため、ファイル 2 では常に 84 行しか取得できません。

使ってみて、

for i in $(cat list); do sed -n "${i}p" file1 >> file2; done
于 2013-06-11T05:21:27.110 に答える
1

for/while ループ全体で sed/awk を実行することを避けることができます。

# store all lines numbers in a variable using pipe
lines=$(echo $(<list) | sed 's/ /|/g')

# print lines of specified line numbers and store output
awk -v lineS="^($lines)$" 'NR ~ lineS' file1 > out
于 2013-06-11T05:35:44.213 に答える