Bash按相反顺序重复分隔文件的行

Bash按相反顺序重复分隔文件的行,bash,awk,sed,Bash,Awk,Sed,假设我有以下文本分隔符file delimiter=space。每行有两个由空格分隔的整数 示例输入文件 1 2 1 3 2 1 我想复制每一行,但颠倒了,同一行中的第一个数字变为第二个,第二个变为第一个。重复的行将被添加到文件的末尾,尽管顺序并不重要,因为我将在以后对它们进行排序 输出文件 1 2 1 3 1 2 2 1 3 1 2 3 是否有任何awk,使用一个衬垫来完成此操作?使用awk: awk '{print $2 " " $1}' test.txt > test1.

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

示例输入文件

1 2
1 3
2 1
我想复制每一行,但颠倒了,同一行中的第一个数字变为第二个,第二个变为第一个。重复的行将被添加到文件的末尾,尽管顺序并不重要,因为我将在以后对它们进行排序

输出文件

1 2
1 3
1 2
2 1
3 1
2 3    
是否有任何awk,使用一个衬垫来完成此操作?

使用awk:

awk '{print $2 " " $1}' test.txt > test1.txt && cat test1.txt >> test.txt && rm test1.txt
只需打印第二个字段,后跟一个空格,再后跟第一个字段,然后分两步将其追加到文件末尾。对于非常大的文件,如果只是立即附加到文件末尾,那将是危险的。

使用awk:

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

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

以下是一种使用awk排序的方法:

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

第一轮时,字段打印正常。第二轮时,NR不再等于FNR,因此字段以相反的方式打印。

这里有一种方法可以使用awk排序来完成此操作:

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

第一轮时,字段打印正常。第二轮时,NR不再等于FNR,因此字段以相反的方式打印。

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

cp file1 file2 && 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

如果文件如一些人所建议的那样庞大,那么这将比运行两次awk更快:

cp file1 file2 && 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

谢谢已经投了赞成票。但是汤姆的解决方案更优雅,所以我会接受他的。谢谢不需要printf-{print$2,$1}就足够了。这很危险。如果test.txt足够大,那么您可以填充磁盘,因为awk将读取文件的原始结尾,并处理您刚才添加的内容。之后的事情。。。还有一些。。。不过,对于较小的文件,这可能没问题,因为在附加任何输出之前,整个文件都将被读入并馈送到awk。感谢您的评论,我已经采纳了您的建议。谢谢。已经投了赞成票。但是汤姆的解决方案更优雅,所以我会接受他的。谢谢不需要printf-{print$2,$1}就足够了。这很危险。如果test.txt足够大,那么您可以填充磁盘,因为awk将读取文件的原始结尾,并处理您刚才添加的内容。之后的事情。。。还有一些。。。不过,对于较小的文件,这可能没问题,因为在附加任何输出之前,整个文件都将被读入并馈送到awk。感谢您的评论,我已经采纳了您的建议。我得到了奇怪的输出。它不是某处吗?我不知道它是什么意思。如果你得到奇怪的输出,那是因为你有奇怪的输入。请在输入文件上尝试cat-v,查看它是否包含控制字符,如果文件是在Windows上创建的,则最有可能是控制Ms-如果是,请使用dos2unix或类似工具删除它们。很抱歉,该文件是在Windows上创建的,因此我必须运行dos2unix文件名,此后awk工作正常。我得到了奇怪的输出。它不是某处吗?我不知道它是什么意思。如果你得到奇怪的输出,那是因为你有奇怪的输入。请在输入文件上尝试cat-v,查看它是否包含控制字符,如果文件是在Windows上创建的,则最有可能是控制Ms,如果是,请使用dos2unix或类似工具删除它们。很抱歉,该文件是在Windows上创建的,因此我必须运行dos2unix文件名,此后awk工作正常。