1

このようなアドレスのリストを含むファイルがあります(ADDRESS_FILE)

0xf012134  
0xf932193  
.  
.  
0fx12923a

このような番号のリストを含む別のファイルがあります(NUMBERS_FILE)

20  
40  
.  
.  
12

ADDRESS_FILEから最初の20行を切り取り、それを新しいファイルに入れてから、
ADDRESS_FILEから次の40行を切り取り ます。

以下に示すような一連のsedコマンドが機能することを私は知っています

sed -n 1,20p ADDRESSS_FILE > temp_file_1
sed -n 20,60p ADDRESSS_FILE > temp_file_2
.  
.
sed -n somenumber,endofilep.  ADDRESS_FILE > temp_file_n

しかし、sedの実行ごとにカットする行数を変更するシェルスクリプトを使用して、これを自動的に実行したいと思います。

これを行う方法 ???

また、一般的な注意点として、このような場合に非常に役立つLinuxのテキスト処理コマンドはどれですか。

4

4 に答える 4

2

行番号がlines、並べ替えなどのファイルにあると仮定して、次のことを試してください。

#!/bin/sh

j=0
count=1
while read -r i; do
  sed -n $j,$i > filename.$count  # etc... details of sed/redirection elided
  j=$i
  count=$(($count+1))
done < lines

ノート。上記は、反復ごとに分割する行数が一定であることを前提とはしていません。

さらに一般的なユーティリティを要求したので、 splitを試してください。ただし、これは一貫した行数で分割されるため、ここではおそらく使用が制限されます。

于 2012-08-02T14:08:27.227 に答える
1
size=$(wc -l ADDRESSS_FILE)
i=1
n=1
while [ $n -lt $size ]
do
  sed -n $n,$((n+19))p ADDRESSS_FILE > temp_file_$i
  i=$((i+1))
  n=$((n+20))
done

あるいは単に

split -l20 ADDRESSS_FILE temp_file_

(アイデアをくれたBrian Agnewに感謝します)。

于 2012-08-02T14:11:09.283 に答える
1

NUMBERS_FILE:から直接読み取る別の方法を次に示します。

n=0; i=1
while read; do 
  sed -n ${i},+$(( REPLY - 1 ))p ADDRESS_FILE > temp_file_$(( n++ ))
  (( i += REPLY ))
done < NUMBERS_FILE
于 2012-08-02T14:51:08.217 に答える
1

1回の呼び出しで機能する醜い解決策はsed、恐らく恐ろしくないものにすることができます。

これにより、ファイルを分割するための小さなsedスクリプトが生成されます

#!/bin/bash
sum=0
count=0
sed -n -f <(while read -r n ; do
    echo $((sum+1),$((sum += n)) "w temp_file_$((count++))" ;
done < NUMBERS_FILE) ADDRESS_FILE
于 2012-08-02T15:21:15.827 に答える