Bash 如何浏览文件中的行?
我有一个包含10行内容的文件: aaaa,bbb,132,a.g.n 我想一行一行地走,把数据放在输出文件中遇到“”之前Bash 如何浏览文件中的行?,bash,Bash,我有一个包含10行内容的文件: aaaa,bbb,132,a.g.n 我想一行一行地走,把数据放在输出文件中遇到“”之前 if [ $# -eq 2 ] && [ -f $1 ] then echo "Read nr of fields to be saved or nr of commas." read n nrLines=$(wc -l < $1) while $nrLines!="1" read -r line || [[ -n
if [ $# -eq 2 ] && [ -f $1 ]
then
echo "Read nr of fields to be saved or nr of commas."
read n
nrLines=$(wc -l < $1)
while $nrLines!="1" read -r line || [[ -n "$line" ]]; do
do
for (( i=1; i<=$n; ++i ))
do
while [ read -r -n1 temp ]
do
if [ temp != "," ]
then
echo $temp > $(result$i)
else
fi
done
paste -d"\n" $2 $(result$i)
done
nrLines=$($nrLines-1)
done
else
echo "File not found!"
fi
要从名为file.txt的文件打印第2016行,您必须运行如下命令-
sed -n '2016p' < file.txt
sed-n'2016p'
更多-
sed-n'2p'
将打印第二行
sed -n '2011p' < file.txt
sed-n'2011p'
2011线
sed -n '10,33p' < file.txt
sed-n'10,33p'
第10行到第33行
sed -n '1p;3p' < file.txt
sed-n'1p;3p'
一、三号线
等等
有关更多详细信息,请查看和
[wspace@wspacesandbox]$awk-F“,“'BEGIN{OFS=“\n”}{for(i=1;i在native bash中,假设将script.sh
的内容替换为以下内容,则以下内容应该可以执行:
#!/bin/bash
IN_FILE=${1}
OUT_FILE=${2}
IFS=\,
while read line; do
set -- ${line}
for ((i=1; i<=${#}; i++)); do
((${i}==4)) && continue
((n+=1))
printf '%s\n' "Line ${n} info: ${!i}"
done
done < ${IN_FILE} > ${OUT_FILE}
!/bin/bash
IN_FILE=${1}
OUT_FILE=${2}
如果s=\,,
边读边做
设置--${line}
对于((i=1;i${OUT_FILE}
这将不会在输出文件的新行上打印输入文件中每行的第四个字段(我假设这是您的要求,根据您的评论?)。尝试此操作(使用您的示例行进行测试):
所有用逗号分隔的字都存储在一个数组中$arr
tmp数组$newarr
删除最后一个$n
元素($n
获取读取
命令)
它在新数组上循环,并打印出输出文件$2
。您尝试过吗
sed "s|,|\n|g" $1 | head -n -1 > $2
我假设只有最后一个单词的右边不会有逗号。您只需使用bash进行参数扩展和子字符串删除即可完成所需操作。例如,以一个示例文件为例:
$ cat dat/10lines.txt
aaaa,bbb,132,a.g.n.
aaaa,bbb,133,a.g.n.
aaaa,bbb,134,a.g.n.
aaaa,bbb,135,a.g.n.
aaaa,bbb,136,a.g.n.
aaaa,bbb,137,a.g.n.
aaaa,bbb,138,a.g.n.
aaaa,bbb,139,a.g.n.
aaaa,bbb,140,a.g.n.
aaaa,bbb,141,a.g.n.
使用本机bash字符串处理的简单单行程序可以如下所示,并给出以下结果:
$ while read -r line; do echo ${line%,*}; done <dat/10lines.txt
aaaa,bbb,132
aaaa,bbb,133
aaaa,bbb,134
aaaa,bbb,135
aaaa,bbb,136
aaaa,bbb,137
aaaa,bbb,138
aaaa,bbb,139
aaaa,bbb,140
aaaa,bbb,141
从左侧开始,直到并包括第一个,“
是:
${var#*,} # bbb,132,a.g.n.
${var##*,} # a.g.n.
${var%,*} # aaaa,bbb,132
${var%%,*} # aaaa
从左侧开始,直到并包括最后一个,“
是:
${var#*,} # bbb,132,a.g.n.
${var##*,} # a.g.n.
${var%,*} # aaaa,bbb,132
${var%%,*} # aaaa
从右侧开始,删除并包括第一个,“
是:
${var#*,} # bbb,132,a.g.n.
${var##*,} # a.g.n.
${var%,*} # aaaa,bbb,132
${var%%,*} # aaaa
从左侧开始,直到并包括最后一个,“
是:
${var#*,} # bbb,132,a.g.n.
${var##*,} # a.g.n.
${var%,*} # aaaa,bbb,132
${var%%,*} # aaaa
注意:上面要删除的文本用通配符表示,但不需要使用通配符。它可以是任何允许的文本。例如,要仅删除,a.g.n
,其中前面的数字是136
,可以执行以下操作:
${var%,136*},136 # aaaa,bbb,136 (all others unchanged)
好的。我想知道hot在行走时忽略逗号抛出一个数组。如何增加我的字符计数器。请看这里-并使用这个答案的答案关于管道,可以在这里找到-如果你觉得我的答案有用,请接受它,这样我们都可以有一些我认为我不理解的点。我想知道我计算一行。我读一个字符,我把它放在一个变量中。如果我读的字符是“,”我想忽略它并进入下一个字符。我不需要跳转文件行,我只需要提前移动1个位置。在文章的开头,你说你想把数据放在一个变量中,但在你的代码中,你只需要把它放在一个文件中。如果你想把每个字段存储到一个单独的变量中,使用“剪切”,如果你想这样做的话解析整个文件并用换行符而不是逗号将其拆分为一个新文件,使用'tr'。我认为关于缺少第四行的OP注释是一个错误!你是对的,'awk'是最好的方法。我理解你的方法,但这里的想法不是以不同的方式解决问题,而是指出如何在ar中进一步导航ray.我应该在else上写什么,在那里我有一个#line.variableresult
包含什么?您的目的是将一行用逗号分隔的行拆分为多行(忽略最后一个字段),然后将它们存储到名为$result$i
的文件中,10行到10个文件,对吗?我已更新了代码,因此不会考虑最后一行。您能否更清楚地告诉我们您想要做什么,包括完整的输入文件和输出文件: