生成文本行的递归重复列表

生成文本行的递归重复列表

如何扩展文本文件:

原始文本文件:

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
  1. 当然,请替换file为您的文件名。

  2. awk是一个逐行处理输入并对其进行“操作”的程序。

  3. out=out$0\n创建一个变量out并将当前行附加到该变量,后跟换行符。

  4. NR>5{...}意思是“对大于第 5 行的记录(例如行)执行大括号中的操作。

  5. printf "%s", out打印变量out.

  6. sub("^[^\n]+\n","",out)out是一个替换命令,这里用作删除命令,用空字符串替换直到第一个换行符的开头。

  7. 要将输出保存到第二个文件file2,请在行末尾添加“"> file2”。

更新:

确实存在另一种工具,sed称为流编辑器,这会产生一个更短但更神秘的解决方案:

 sed -n '6,${x;p;s/^[^\n]\+\n//;x};H;1h;${x;p}' file
  1. 1h将第一行放在“保留”空间中。

  2. H将行追加到保留空间。

  3. 6,${x;p;s/^[^\n]\+\n//;x},从第 6 行开始,将保留空间与当前行交换,打印它,删除第一行,并将结果发送回保留空间。

  4. ${x;p},在处理结束时,带回保留空间(可能是 ag而不是 an x),并打印它。

答案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

相关内容