簡體   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