假设我有以下文本分隔文件(delimiter = space)。每行有两个由空格分隔的整数。
示例输入文件
1 2
1 3
2 1
我想复制每一行但反转(同一行内的第一个数字变成第二个,第二个变成第一个)。将在文件末尾添加重复的行(尽管顺序并不重要,因为我将在以后对它们进行排序)。
输出文件
1 2
1 3
1 2
2 1
3 1
2 3
有没有awk,sed one-liner这样做?
答案 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