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
假设我有以下文本分隔文件(分隔符 = 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