如何扩展文本文件:
原始文本文件:
1
2
3
4
5
etc
所需扩展结果:
1
2
3
4
5
2
3
4
5
6
3
4
5
6
7
etc.
即将文件 1 中的前 5 行列出到新的扩展文件 2 中,然后附加从 n+1 开始的第二个 5 块,然后从 n+2 开始添加第三块,依此类推,直到文件 1 末尾
答案1
只需运行这一行一次:
awk 'NR>5{printf"%s",out;sub("^[^\n]+\n","",out)}{out=out$0"\n"}END{printf "%s",out}' file
当然,请替换
file
为您的文件名。awk
是一个逐行处理输入并对其进行“操作”的程序。out=out$0\n
创建一个变量out
并将当前行附加到该变量,后跟换行符。NR>5{...}
意思是“对大于第 5 行的记录(例如行)执行大括号中的操作。printf "%s", out
打印变量out
.sub("^[^\n]+\n","",out)
out
是一个替换命令,这里用作删除命令,用空字符串替换直到第一个换行符的开头。要将输出保存到第二个文件
file2
,请在行末尾添加“"> file2”。
更新:
确实存在另一种工具,sed
称为流编辑器,这会产生一个更短但更神秘的解决方案:
sed -n '6,${x;p;s/^[^\n]\+\n//;x};H;1h;${x;p}' file
1h
将第一行放在“保留”空间中。H
将行追加到保留空间。6,${x;p;s/^[^\n]\+\n//;x}
,从第 6 行开始,将保留空间与当前行交换,打印它,删除第一行,并将结果发送回保留空间。${x;p},在处理结束时,带回保留空间(可能是 a
g
而不是 anx
),并打印它。
答案2
# get number of lines in the file
n=$( wc -l <file )
# extend the file
awk -v n="$n" 'NR <= n { print $1+1 >>FILENAME }' file
根据需要多次运行这两个命令。
该awk
程序只是将行附加到它正在读取的同一文件中。附加的数据将是现有数字加一。
如果我们不通过文件中的行数(使用NR <= n
)来限制它,它将无限增长,直到填满分区。
答案3
给定一个input
文件seq 10 > input
:
1
2
3
4
5
6
7
8
9
10
下面将循环遍历文件的行,打印每个 5 块:
n=$(wc -l < input)
for((i=1; i <= n-4; i++)); do sed -n "$i,$((i+4))p" < input; done
导致:
1
2
3
4
5
2
3
4
5
6
3
4
5
6
7
4
5
6
7
8
5
6
7
8
9
6
7
8
9
10