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

但我想使用 shell 脚本自动执行此操作,这将更改每次 sed 执行时要剪切的行数。

这个怎么做 ???

另外一般来说,在这种情况下,哪些是 linux 中非常有用的文本处理命令?

4

4 回答 4

2

假设您的行号位于名为lines, sorted 等的文件中,请尝试:

#!/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_

(感谢布赖恩阿格纽的想法)。

于 2012-08-02T14:11:09.283 回答
1

An ugly solution which works with a single sed invocation, can probably be made less horrible.

This generates a tiny sed script to split the file

#!/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 回答
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 回答