Bash重复行的分隔文件逆序

时间:2015-01-15 15:35:35

标签: bash awk sed

假设我有以下文本分隔文件(delimiter = space)。每行有两个由空格分隔的整数。

示例输入文件

1 2
1 3
2 1

我想复制每一行但反转(同一行内的第一个数字变成第二个,第二个变成第一个)。将在文件末尾添加重复的行(尽管顺序并不重要,因为我将在以后对它们进行排序)。

输出文件

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

有没有awk,sed one-liner这样做?

3 个答案:

答案 0 :(得分:4)

这里有一种方法可以使用awk(保留排序):

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

它使用记录号a作为键并使用反向行作为值来填充数组NR。最后,它循环遍历数组,打印出所有值。

为避免将所有行存储在内存中,您可以两次传递文件:

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

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

答案 1 :(得分:1)

使用awk:

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

只需打印第二个字段,然后是空格,然后是第一个字段,然后分两步追加到文件的末尾。 (非常大的文件只是立即附加到文件末尾会很危险。)

答案 2 :(得分:1)

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

cp file1 file2 && awk '{print $2,$1}' file1 >> file2

或:

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

但是如果你不想两次指定文件名,只需使用Toms awk命令或者这样:

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