繁体   English   中英

使用Shell脚本从文件中提取指定的行号

[英]extracting specified line numbers from file using shell script

我有一个带有地址列表的文件,看起来像这样(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中的哪些文本处理命令非常有用?

假设行号在一个名为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 但是,这会分割成一定数量的行,并且在这里可能用途有限。

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的想法)。

这是一种直接从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

一个可以与单个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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM