gpt4 book ai didi

shell - 获取文件行的​​ 25%

转载 作者:行者123 更新时间:2023-12-01 10:58:57 26 4
gpt4 key购买 nike

我尝试随机显示 25% 的文件行

这是我的脚本:

file=$1
nb_lignes=$(wc -l $file | cut -d " " -f1)
num_lines_to_get=$((25*${nb_lignes}/100))
for (( i=0; i < $num_lines_to_get; i++))
do
line=$(head -$((${RANDOM} % $nb_lignes)) $file | tail -1)
echo "$line"
done
fi

我是这样跑的

./script.sh file

文件是:

xxxxxxxx-54.yyyyy
xxxxxxxx-55.yyyyy
xxxxxxxx-60.yyyyy
xxxxxxxx-66.yyyyy

我的问题是如何消除 54 和 55,我的意思是除了第 54 和 55 两行,我想要这个列表的 25%,我想在命令中这样指定它

./script.sh file 54 55

谢谢。

最佳答案

除非您知道有多少行代表 100%,否则无法计算 25%,因此您的所有解决方案要么 (1) 是单 channel 并将文件存储在内存中,要么 (2) 是多 channel 以便收集行数。我不知道你要处理多长时间的文件,但无论如何我更喜欢第二种选择,所以我就是这样回答的。

如果您运行的是 Linux,那么您可能拥有大多数工具的 GNU 版本。一种解决方案可能是:

#!/bin/sh

linecount=$(awk 'END{printf("%d", NR * 0.25)}' input.txt)
exclude="$@"
egrep -vw "${exclude// /|}" input.txt | shuf -n$linecount

或者:

#!/bin/sh

linecount=$(awk 'END{printf("%d", NR * 0.25)}' input.txt)
exclude="$@"
egrep -vw "${exclude// /|}" input.txt | sort -R | head -n $linecount

此解决方案假定“xxxxxx”和“yyyyy”字符串不包含您要跳过的数字的单词分隔版本。如果可能的话,那么您可能应该向我们提供更多详细信息,例如实际样本数据。

如果您使用的是 FreeBSD 或 OSX,则 sort 没有 -R 选项并且不包括 shuf,但你仍然可以完成这项工作。您的系统中将有一个名为 jot 的工具。它可以用来产生一个范围内的随机数。所以这有点尴尬,但它有效:

#!/bin/sh

# `awk` is a little heaver than `wc`, but you don't need to parse its output.
lines=$(awk 'END{printf("%d", NR * 0.25)}' input.txt)

exclude="$@"

# First, put a random number at the beginning of each line.
while read line; do
# skip lines that match our exclusion list
if [[ $line =~ -($exclude). ]]; then
continue
fi
echo "`jot -r 1 1 10000000` $line"
done < input.txt > stage1.txt

# Next, sort by the random number.
sort -n stage1.txt > stage2.txt

# Last, remove the number from the start of each line.
sed -r 's/^[0-9]+ //' stage2.txt > stage3.txt

# Show our output
head -n $lines stage3.txt

# Clean up
rm stage1.txt stage2.txt stage3.txt

如果您愿意,可以组合其中的一些行以避免将内容暂存到单独的文件中。

#!/bin/sh

lines=$(awk 'END{printf("%d", NR * 0.25)}' input.txt)

exclude="$@"

while read line; do
if [[ $line =~ -(${exclude// /|})\. ]]; then
continue
fi
echo "`jot -r 1 1 10000000` $line"
done < input.txt | sort -n | sed -r 's/^[0-9]+ //' | head -n $lines

# no clean-up required

关于shell - 获取文件行的​​ 25%,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12988517/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com