Bash 分隔文件倒序的重复行

Bash duplicate lines of delimited file reverse order

假设我有以下文本分隔文件(分隔符 = space)。每行有两个整数,由 space.

分隔

示例输入文件

1 2
1 3
2 1

我想复制每一行但颠倒(同一行中的第一个数字成为第二个,第二个成为第一个)。重复的行将被添加到文件的末尾(尽管顺序并不重要,因为无论如何我都会稍后对它们进行排序)。

输出文件

1 2
1 3
1 2
2 1
3 1
2 3    

有没有 awk, sed 一行代码可以做到这一点?

使用 awk:

awk '{print  " " }' test.txt > test1.txt && cat test1.txt >> test.txt && rm test1.txt

简单地打印第二个字段,然后是 space,然后是第一个字段,然后分两步附加到文件末尾。 (对于非常大的文件,立即简单地附加到文件末尾是很危险的。)

这是您可以使用 awk 执行此操作的一种方法(保留顺序):

awk '{a[NR]= FS ;print}END{for(i=1;i<=NR;++i)print a[i]}' file.txt

它使用记录号 NR 作为键,反转的行作为值来填充一个数组 a。最后,它遍历数组打印出所有值。

为避免将所有行都存储在内存中,您可以改为遍历文件两次:

awk 'NR==FNR{print;next}{print ,}' file.txt file.txt

第一次,字段打印正常。第二次,NR 不再等于 FNR,因此字段被反向打印。

如果文件像某些人建议的那样很大,那么这会比 运行 awk 快两次:

cp file1 file2 && awk '{print ,}' file1 >> file2

或:

(cat file1 && awk '{print ,}' file1) > file2

但如果您不想两次指定文件名,则只需使用 Toms awk 命令或此命令:

awk 'BEGIN{ARGV[ARGC]=ARGV[ARGC-1];ARGC++} NR==FNR{print;next} {print ,}' file1 > file2