Bash:根据行数划分一个文件并将数据保存到两个不同的文件中,这是如何完成的?

Bash:根据行数划分一个文件并将数据保存到两个不同的文件中,这是如何完成的?,bash,shell,Bash,Shell,我正在编写一个bash脚本,它应该在一个文件列表上运行,计算每个文件的行数,然后将行数除以2,将文件的前半部分保存到一个文件,将文件的后半部分保存到另一个文件 #!/bin/bash for file in $(ls .); do count=$(wc -l $file) half=$(($count/2 )) head -n $half $file > $file-1h.list tail -n $half $file > $file-2h.list done 但它不起作用。。。

我正在编写一个bash脚本,它应该在一个文件列表上运行,计算每个文件的行数,然后将行数除以2,将文件的前半部分保存到一个文件,将文件的后半部分保存到另一个文件

#!/bin/bash
for file in $(ls .); do
count=$(wc -l $file)
half=$(($count/2 ))
head -n $half $file > $file-1h.list
tail -n $half $file > $file-2h.list
done
但它不起作用。。。我做错了什么?
谢谢

您可以使用如下所示的拆分命令:

split -l 500 myfile segment
其中-l表示行数
myfile是要拆分的大文件
段-是每个拆分的前缀

因此,如果我的文件中有1000行,那么它将创建两个文件,每个文件有500行,如下所示:

segmenta
segmentb
在gnu中,您可以使用-n(即拆分数),如下所示,并只读取一次文件:

#!/bin/bash
for file in *; do
    split -n 2 ${file} ${file}.
done
在另一种情况下,使用split的一种肮脏的方法是:

#!/bin/bash
for file in *; do
    split -l $[ $(wc -l ${file} | cut -d" " -f1) * 50 / 100 ] ${file} ${file}.
done

在这里,您循环遍历每个文件,并计算计数,即文件中的行数的50%,并将其分成两半。

您的主要问题出现在这里:

count=$(wc -l $file)
它返回
行号和文件名
。文件名不能用于
计数/2
计算,因此会出现错误。应该是:

count=$(wc -l <"$file")

例如:不要解析
ls
的输出:对*中的文件使用
;改为执行
。你需要检查你是否真的有一个
[[[-f$file]]| |继续
。两个:
count=$(wc-l
。否则,
count
也包含文件名。对于三个,使用更多引号。对于四个,不要读取文件两次…如何将前半部分数据导出到一个文件中,将后半部分数据导出到第二个文件中?如何将前半部分数据导出到一个文件中,将后半部分数据导出到第二个文件中?如果只读取一次文件,不能实现同样的效果吗<代码>;)。你只读了一次文件:)哦,你说的是头/尾。当然
#!/bin/bash

for file in *; do

    [ -f "$file" ] || continue          # make sure it is a file (not dir)

    count=$(wc -l <"$file")             # get total lines
    [ "$count" -lt 2 ] && {             # skip files with less than 2 lines
        printf "error file '%s' cannot be divided\n" "$file" >&2
        continue
    }
    half_1=$((count/2 ))                # divide by 2 (will round down if odd)
    half_2=$((count-half_1))            # get the other 1/2 by subtraction

    head -n $half_1 "$file" > "$file-1h.list"
    tail -n $half_2 "$file" > "$file-2h.list"

done