如何使用for循环和使用awk的数组对文件的行进行重新排序



我有一种情况,我需要获取一个输入文件,按照一个无法从文件中确定的顺序对其行进行重新排序,但根据我可以指定的顺序,然后将新顺序输出到一个新文件中。

输入文件(为演示更改了内容)

This should be line four
This should be line six
This should be line three
This should be line two
This should be line seven
This should be line one
This should be line five

预期输出文件

This should be line one
This should be line two
...
This should be line seven

我认为awk可能是最好的方法,将所需的顺序存储在数组中,然后循环通过它并拉出相对行可能会奏效。

我已经写了以下内容来建立数组并在其中循环,按照输出的顺序打印行号:

awk 'BEGIN { split("4 6 3 2 7 1 5",n); for(i=1; i<=7; i++) print n[i] }'

输出:

4
6
3
2
7
1
5

之前使用过NR后,我认为我可以简单地用print n[i]代替NR==n[i],但这不会导致错误,但也会导致空白output.txt

awk 'BEGIN { split("4 6 3 2 7 1 5",n); for(i=1; i<=7; i++) NR==n[i] }' file.txt > output.txt

我正在寻找最优雅的解决方案,要么成功地调整我上面的最后一次尝试,根据数组将file.txt的相对行号打印到output.txt中,要么作为一个我可能不知道的更好的整体方法。

我对其他显示的预期输出和o/p感到困惑

一个简单的方法我不知道你是否喜欢

akshay@Aix:/tmp$ cat file
This should be line four
This should be line six
This should be line three
This should be line two
This should be line seven
This should be line one
This should be line five
akshay@Aix:/tmp$ cat seq
4
6
3
2
7
1
5
akshay@Aix:/tmp$ paste seq file | sort -nk1 | sed 's/^[0-9]*s//'
This should be line one
This should be line two
This should be line three
This should be line four
This should be line five
This should be line six
This should be line seven
awk 'BEGIN{split("4 6 3 2 7 1 5",n)} {a[NR]=$0} END{for(i=1;i in n;i++) print a[n[i]]}' file.txt > output.txt

相关内容

  • 没有找到相关文章

最新更新