如何从文件中浏览一行?

时间:2016-03-28 08:30:29

标签: bash

我有一个包含10行的文件,其中包含以下内容: AAAA,BBB,132,a.g.n。

我想走路每一行,char by char并将数据放在" ,"在输出文件中得到满足。

    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

}

在参数$ 2中,我有一个空文件,我将在文件$ 1中存储数据,而不是使用&#34; ,&#34;并添加几条评论。

Example:
My input_file contains:
a.b.c.d,aabb,comp,dddd
My output_file is empty.

I call my script: ./script.sh input_file output_file
After execution the output_file contains:
First line info: a.b.c.d
Second line info: aabb
Third line info: comp

(yes, without the 4th line info)

6 个答案:

答案 0 :(得分:0)

要从名为 file.txt 的文件中打印第2016行,您必须运行这样的命令 -

Allocator

更多 -

MATCH (u:User) WHERE u.first_name =~'(?i).*first.*' RETURN u
UNION ALL u.last_name =~'(?i).*last.*' return u
UNION ALL u.first_name =~'(?i).*last.*' RETURN u
UNION ALL u.last_name =~'(?i).*first.*' return u

将打印第2行

sed -n '2016p' < file.txt

2011th line

sed -n '2p' < file.txt

第10行到第33行

sed -n '2011p' < file.txt

第1和第3行

依旧......

有关详情,请参阅 this tutorial this answer

答案 1 :(得分:0)

[wspace@wspace sandbox]$ awk -F"," 'BEGIN{OFS="\n"}{for(i=1; i<=NF-1; i++){print "line Info: "$i}}' data.txt
line Info: a.b.c.d
line Info: aabb
line Info: comp

这个小片段可以忽略最后一个字段。

更新

#!/usr/bin/env bash


if [ ! -f "$1" -o $# -ne 2 ];then
    echo "Usage: $(basename $0) input_file out_file"
    exit 127
fi

input_file=$1
output_file=$2

: > $output_file

if [ "$(wc -l < $1)" -ne 0 ];then
    while true
    do
        read -r -n1 char
        if [ "$char" == "" ];then
            break
        elif [ $char != "," ];then
            temp=$temp$char
        else 
            echo "line info: $temp" >> $output_file
            temp=""
        fi
    done < $input_file
else
    echo "file $1 is empty"
fi

也许这就是你想要的

答案 2 :(得分:0)

在原生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}

这不会打印输入文件中每行的第4个字段,在输出文件的新行上(我认为这是你的评论要求吗?)。

答案 3 :(得分:0)

试试这个(用你的样本线测试):

#!/bin/bash
# script.sh
echo "Number of fields to save ?"
read nf

while IFS=$',' read -r -a arr; do
  newarr=${arr[@]:0:${nf}}
done < "$1"

for i in ${newarr[@]};do
  printf "%s\n" $i 
done > "$2"

执行脚本:

$ ./script.sh inputfile outputfile
Number of fields ?
3
$ cat outputfile
a.b.c.d
aabb
comp

用逗号分隔的所有单词都存储在数组$arr

tmp数组$newarr删除最后$n个元素($n获取read命令。)

它遍历新数组并将结果打印在输出文件$2中。

答案 4 :(得分:0)

你试过吗

perf list

我假设只有最后一个单词右边没有逗号。

答案 5 :(得分:0)

只需使用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

Paremeter扩展w /子串移除的工作原理如下:

var=aaaa,bbb,132,a.g.n.

从左侧开始,向上移除并包括第一个','

${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) 表示,但不需要使用通配符。它可以是任何允许的文本。例如,要仅删除前面的数字为// Save image to disk NSString *documentaryPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; NSString *filePath = [NSString stringWithFormat:@"%@/Image.png",documentaryPath]; NSData *data = [NSData dataWithData:UIImagePNGRepresentation(YOUR_IMAGE)]; [data writeToFile:filePath atomically:YES]; // Retrieve the Image - (NSData *) imageData { NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; NSString *pngFilePath = [NSString stringWithFormat:@"%@/Image.png",docDir]; NSData *dataImage = [NSData dataWithContentsOfFile:pngFilePath]; return dataImage; } 的{​​{1}},您可以执行以下操作:

UIImage *image = [UIImage imageWithData:imageData]