![根据第二个文件对文件重新排序](https://linux22.com/image/76839/%E6%A0%B9%E6%8D%AE%E7%AC%AC%E4%BA%8C%E4%B8%AA%E6%96%87%E4%BB%B6%E5%AF%B9%E6%96%87%E4%BB%B6%E9%87%8D%E6%96%B0%E6%8E%92%E5%BA%8F.png)
我有一个乱序的文件。我想使用第二个文件对其进行重新排序。
文件1
1 HD;BSkyB:11097:VC23M5O25P0S1:S28.2E:23000:2305=27:2307=NAR@4;2306=eng@106:2308;2309=eng:0:21000:2:2066:0
2 HD;BSkyB:11097:VC23M5O25P0S1:S28.2E:23000:2315=27:2316=NAR@4;2317=eng@106:2318;2319=eng:0:21020:2:2066:0
3 HD;BSkyB:11097:VC23M5O25P0S1:S28.2E:23000:2320=27:2321=NAR@4;2322=eng@106:2323;2324=eng:0:21030:2:2066:0
ITV HD;BSkyB:11097:VC23M5O25P0S1:S28.2E:23000:2305=27:2307=NAR@4;2306=eng@106:2308;2309=eng:0:21000:2:2066:0
还有第二个文件
3 HD
1 HD
2 HD
我想扫描文件二,并对文件1重新排序,并将剩余的文件修改到文件末尾,所以最终结果是
3 HD;BSkyB:11097:VC23M5O25P0S1:S28.2E:23000:2320=27:2321=NAR@4;2322=eng@106:2323;2324=eng:0:21030:2:2066:0
1 HD;BSkyB:11097:VC23M5O25P0S1:S28.2E:23000:2305=27:2307=NAR@4;2306=eng@106:2308;2309=eng:0:21000:2:2066:0
2 HD;BSkyB:11097:VC23M5O25P0S1:S28.2E:23000:2315=27:2316=NAR@4;2317=eng@106:2318;2319=eng:0:21020:2:2066:0
ITV HD;BSkyB:11097:VC23M5O25P0S1:S28.2E:23000:2305=27:2307=NAR@4;2306=eng@106:2308;2309=eng:0:21000:2:2066:0
有任何想法吗?
提前致谢。
答案1
根据文件的大小,将每一行加载到数组中将是处理此问题的最简单方法。使用索引文件获取对象键(对数组中项目的引用)并写入该行、循环等。
我看到你标记了 Linux/bash,所以这里有一些帮助信息。
Bash 数组仅具有编号索引,但它们是稀疏的,即您不必定义所有索引。可以通过将数组项括在括号中来分配整个数组:
arr=(Hello World)
可以使用熟悉的数组语法分配单个项目(除非您习惯使用 Basic 或 Fortran):
arr[0]=Hello
arr[1]=World
但是当你想引用一个数组项时,它会变得有点难看:
echo ${arr[0]} ${arr[1]}
引用手册页:需要使用大括号以避免与路径名扩展发生冲突。
此外,还可以使用以下时髦的结构:
${arr[*]} # All of the items in the array
${!arr[*]} # All of the indexes in the array
${#arr[*]} # Number of items in the array
${#arr[0]} # Length of item zero
${!arr[*]} 是 bash 中相对较新的补充,它不是原始数组实现的一部分。
以下示例显示了一些简单的数组用法(请注意“[index]=value”赋值以分配特定索引):
#!/bin/bash
array=(one two three four [5]=five)
echo "Array size: ${#array[*]}"
echo "Array items:"
for item in ${array[*]}
do
printf " %s\n" $item
done
echo "Array indexes:"
for index in ${!array[*]}
do
printf " %d\n" $index
done
echo "Array items and indexes:"
for index in ${!array[*]}
do
printf "%4d: %s\n" $index ${array[$index]}
done
运行它会产生以下输出: 数组大小:5 数组项:
one
two
three
four
five
数组索引:
0
1
2
3
5
数组项和索引:
0: one
1: two
2: three
3: four
5: five
请注意,可以使用“@”符号代替“" 在 ${arr[ 等结构中]},结果是相同的,除非扩展到带引号的字符串中的数组项。在这种情况下,行为与展开“$" 和 "$@" 在带引号的字符串中: "${arr[]}" 将所有项目作为单个单词返回,而 "${arr[@]}" 将每个项目作为单独的单词返回。
有关 bash 数组的更多信息可以在以下位置找到:http://www.linuxjournal.com/content/bash-arrays
要将文件加载到数组中,您可以使用类似的方法,使用 X 变量向数组添加索引,或者您可以在循环内拉取自定义索引。
#!/bin/sh
files="`cat $1`"
for x in $lines
echo "$x"
done
答案2
awk -F';' '
NR == FNR {a[$1] = $0; next}
{print a[$0]; delete a[$0]}
END {for (l in a) print a[l]}' file1 file2