![通读文件](https://linux22.com/image/137756/%E9%80%9A%E8%AF%BB%E6%96%87%E4%BB%B6.png)
我有一个文件,其中包含按如下顺序排列的详细信息。
Name1
School Name1
State1
Name2
School Name2
State2
Name3
School Name3
State3
我希望它循环 3 次(示例文件包含 3 组,但我在这里想到了逻辑(原文如此),如果有 n 组,则循环应运行 n 组)次,并且在第一个循环中,应从第 1 行读取文件到第 3 行,然后在下一个循环中从第 4 行到第 6 行,然后从第 7 行到第 9 行,依此类推,如果同一集中有更多条目(名称、学校名称、州)。每次迭代时,它将把文件中的输入提供给另一个标准输出文件。我有一个工作脚本,它从文件中获取输入并将其提供给另一个文件,但发现如果集合重复则很难获得逻辑。
答案1
我会这样做一次读取文件 3 行:
while
IFS= read -r name
IFS= read -r school
IFS= read -r state
do
echo "$name:$school:$state"
done < input.file > output.file
利用这样一个事实,您可以将许多命令作为 while 循环的“条件”。
答案2
使用awk
和复制完全相同的输出格伦·杰克曼在他的回答中做了:
$ awk -v OFS=':' '{ name=$0; getline sname; getline state;
print name,sname,state }' <input.file >output.file
-v OFS=':'
将(“输出字段分隔符”)设置为OFS
冒号。getline
中的函数读取awk
下一行(进入指定变量),并print
打印由给定字段组成的记录,以 分隔OFS
。
答案3
使用 GNU sed
:
sed '1~3{N;N;s/\n/:/g}' < input.file > output.file
怎么运行的:
1~3 # match every 3rd line, starting with the 1st
{
N;N; # append the next 2 lines of input into the pattern space
s/\n/:/g # replace newlines with your chosen separator
}
答案4
使用xargs
,
xargs -d'\n' -n3 < file somecommand
将从中获取 3 个换行符分隔的值file
并将它们作为参数传递给somecommand
前任。使用printf
:
$ xargs -d'\n' -n3 < file printf '"%s","%s","%s"\n'
"Name1","School Name1","State1"
"Name2","School Name2","State2"
"Name3","School Name3","State3"