[英]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.