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

Arrays 如何使用for循环和awk数组对文件行重新排序,arrays,bash,for-loop,file-io,awk,Arrays,Bash,For Loop,File Io,Awk,我有一种情况,我需要获取一个输入文件,按照一个不能从文件中确定的顺序,但可以指定的顺序对其行重新排序,然后将新的顺序输出到一个新文件中 输入文件(为演示更改了内容) 预期输出文件 This should be line one This should be line two ... This should be line seven 我认为awk可能是最好的方法,将所需的顺序存储在一个数组中,然后在其中循环并拉出相对行可能会奏效 我编写了以下内容来建立数组并循环,按照输出的顺序打印行号: aw

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

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

预期输出文件

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] }'
以前使用过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

awk'BEGIN{split(“4 6 3 2 7 1 5”,n);for(i=1;i我对其他人显示的预期输出和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

我对其他人显示的预期输出和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


序列号
4,6,3,2…
是已知信息吗?是的,这是此特定文件的已知信息,如果我不清楚,请道歉。序列号
4,6,3,2…
是已知信息吗?是的,这是此特定文件的已知信息,如果我不清楚,请道歉。我最初使用了与您类似的命令,但我认为,为了得到预期的输出->
6 4 3 1 7 2 5
,实际上需要对序列进行更正。至少他们使用gawk版本3.1.5为我做了更正。@n0741337对,根据示例脚本中指定的行顺序,发布的预期输出与示例输入不匹配。我只是按照脚本中的顺序计算了t他可以很容易地将其更改为任何内容他想要的是。@EdMorton正是我想要的,是我所得到的东西的一个很好的扩展。产生了完美的输出。非常感谢。起初我得到了一个与您类似的命令,但我认为序列实际上需要更正以获得预期的输出->
6 4 3 1 7 2 5
。至少他们使用了gawk版本3.1.5.@n0741337对,根据示例脚本中指定的行顺序,发布的预期输出与示例输入不匹配。我只是按照脚本中的顺序进行操作,认为OP可以很容易地将其更改为任何内容他想要的是。@EdMorton正是我想要的,是我得到的地方的一个很好的扩展。按原样产生了完美的输出。非常感谢。可爱的方法so+1。不过,排序时不需要使用
k1
,因为第一个字段中没有重复项,我会使用
cut-f2-
而不是sed,所以它会更简洁一些:
paste seq file | sort-n | cut-f2-
。哦!刚刚看到你的答案,我发布了一个非常类似的解决方案。请注意,最好在
粘贴
sed
中定义一个分隔符,从开始到(包括)删除那个分隔符。想想
seq
文件中的行可能有尾随空格。我将删除我的答案。考虑到使用awk,我选择了一个不同的答案作为最佳解决方案,但我欣赏它的简单性。谢谢你。感谢Ed Mortan和Kent,我不会编辑我的答案,因为我觉得你的评论很有价值,让人们阅读吧我们的评论也是如此,再次感谢各位。@user3328689实际上Ed的
awk
方法非常好,因为所提到的预期输出不同,所以我回答了这个问题。可爱的方法如此+1。但是排序时不需要
k1
,因为第一个字段中没有重复项,我会使用
cut-f2-
而不是sed,所以更简洁一点:
paste seq file | sort-n | cut-f2-
。哦!刚刚看到你的答案,我发布了一个非常类似的解决方案。请注意,最好在
paste
sed
中定义一个分隔符,从开始到(包括在内)那个分隔符。想想
seq
文件中的行可能有尾随空格。我将删除我的答案。考虑到使用awk,我选择了一个不同的答案作为最佳解决方案,但我欣赏它的简单性。谢谢你。感谢Ed Mortan和Kent,我不会编辑我的答案,因为我觉得你的评论很有价值,让人们阅读吧我们的评论也是,再次感谢各位。@user3328689实际上Ed的
awk
方法非常好,因为所提到的预期输出不同,所以我回答了这个问题。
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
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