【问题标题】:Use awk to print largest alphanumeric grep result and create variable next in sequence使用 awk 打印最大的字母数字 grep 结果并按顺序创建变量 next
【发布时间】:2018-07-03 08:27:10
【问题描述】:

我有一个包含以下信息的源文件。

WABEL8499IPM101
WABEL8499IPM102
WABEL8499IPM103
WABEL8499IPM104
WABEL8499IPM105
WABEL8499IPM106
WABEL8499IPM107
WABEL8499IPM108

我需要能够找到序列中最大的名称,然后使用序列中的下一个逻辑名称创建一个新变量。如有必要,我需要能够创建多个。例如:

使用 grep 搜索显示所有上述结果的 WABEL8499IPM 文件。我需要找到 WABEL8499IPM108,因为它是序列中最大的,然后创建一个新变量(多少取决于用户输入的内容),其值为 WABEL8499IPM109。如果用户输入的数量为 2,那么我需要 109 和 110。我的目标是构建一个 bash 脚本来输入基本名称(没有最后 3 位数字),找到序列中最大的,然后输出到日志文件序列中的下一个名称,无论用户需要多少次。

我不确定从哪里开始。我可以使用 grep 找到所有内容,但很难仅找到最大值/序列。用户将只输入基本名称,因为他们不知道最后 3 位数字。目前我没有任何有效的代码。

SRCFILE="~/Desktop/deviceinfo.csv"  
LOGDIR="~/Desktop/"  
LOGFILE="$LOGDIR/DeviceNames.csv"  

echo -e "\n"  
echo "What is the base device name?"  
read deviceName  
echo "How many device names do you need?"  
read quantityName  
lines=$(grep -c "$deviceName" $SRCFILE)  
echo -e "\n"  
echo "There are $lines results."  
deviceResults=$(grep -F "$deviceName" $SRCFILE)  
echo -e "\n"  
echo Device Name\'s Currently Enrolled:  
echo "$deviceResults"  
echo -e "\n" 
echo "Your output file has been created."
CODE FOR CREATING OUTPUT FILE HERE
echo "$deviceName1" >> "$LOGFILE"  
echo "$deviceName2" >> "$LOGFILE"  
echo "$deviceName3" >> "$LOGFILE"

这种方法是否可以使用参考文件进行输入?例如,如果我必须研究并创建具有不同数量的多个名称,我们是否可以为此使用输入参考文件,这样我们就不必单独键入它们并多次运行脚本?

【问题讨论】:

  • 欢迎来到 SO,很好地尝试解释您的问题,您能否让我们更清楚地知道您正在尝试什么,例如输入文件样本(如果存在)和代码中的预期输出样本TAGS,以便我们也能全面了解您的问题,干杯。
  • 我已经添加了一个示例源和输出文件以及我目前拥有的一些代码。现在我没有代码来创建序列中的下一个名称并将它们添加到要打印到输出文件的变量中。输出的数量应取决于 $quantityName。
  • 请不要提供不鼓励的链接或图片或附件,请在代码标签中粘贴一些示例以进行输入和输出,保持简单并让我们知道。

标签: bash awk grep


【解决方案1】:
SRCFILE="~/Desktop/deviceinfo.csv"  
LOGDIR="~/Desktop/"  
LOGFILE="$LOGDIR/DeviceNames.csv"  

# base name, such as "WABEL8499IPM"
device_name=$1
# quantity, such as "2"
quantityNum=$2

# the largest in sequence, such as "WABEL8499IPM108"
max_sequence_name=$(cat $SRCFILE | grep -o -e "$device_name[0-9]*" | sort --reverse | head -n 1)

# extract the last 3digit number (such as "108") from max_sequence_name
max_sequence_num=$(echo $max_sequence_name | rev | cut -c 1-3 | rev)

# creat a sequence of files starting from "WABEL8499IPM101"  if there is not any "WABEL8499IPM". 
if [ -z "$max_sequence_name" ];
then    
    max_sequence_name=device_name
    max_sequence_num=100
fi

# create new sequence_name
# such as ["WABEL8499IPM109", "WABEL8499IPM110"]
array_new_sequence_name=()
for i in $(seq 1 $quantityNum);
do
    cnum=$((max_sequence_num + i))
    array_new_sequence_name+=($(echo $device_name$cnum))
done

#CODE FOR CREATING OUTPUT FILE HERE
#for fn in ${array_new_sequence_name[@]}; do touch $fn; done;

# write log
for sqn in ${array_new_sequence_name[@]};
do
    echo $sqn >> $LOGFILE
done

用法:

bash test.sh WABEL8499IPM 2

日志文件中的结果:

WABEL8499IPM109
WABEL8499IPM110

已编辑

输入参考文件(input.txt):

WABEL8499IPM,2
WABEL8555IPM,6
WABEL8444IPM,5

驱动程序外壳脚本:

INPFIL="./input.txt"
PSRC="./test.sh"    

cat $INPFIL | while read line; 
do
    device_name=`echo $line | cut -d "," -f 1`
    quantity_num=`echo $line | cut -d "," -f 2`
    bash $PSRC $device_name $quantity_num
done;

【讨论】:

  • 这种方法有没有办法使用参考文件进行输入?例如,如果我必须研究并创建具有不同数量的多个名称,我们是否可以为此使用输入参考文件,这样我们就不必单独键入它们并多次运行脚本?
  • 另一个 shell 脚本使您能够这样做。我编辑了答案。
  • 我无法让这种方法发挥作用。收到“seq: invalid floating point argument: 10\r”错误。 - 实际上我在重新格式化输入文件后做了。它显然在最后看到了别的东西。如果名称不在参考文件中,则会创建名称 WABEL8499IPM1。如果没有找到参考,有什么方法可以让它创建 WABEL8499IPM101?
  • 好吧 - 我让它工作了,但仍然无法弄清楚为什么它在“10\r”等末尾看到其他东西。
  • 在我的环境中,我没有收到来自该程序的任何错误消息。请告诉我您的执行环境和 input.txt 。为了创建 WABEL8499IPM101,我编辑了“test.sh”。
【解决方案2】:

你可以试试

logdir="~/Desktop/"  
srcfile="$logdir/deviceinfo.csv"  
logfile="$logdir/DeviceNames.csv"  

echo
read -p "What is the base device name? " deviceName
echo
read -p "How many device names do you need? " quantityName
echo

awk -v name="$deviceName" \
  -v q="$quantityName" \
  -v lelog="$logfile" '
  $0 ~ "^"name {
    sub(name,"")
    a=a>$0?a:$0
    }
  END {
    if ( a )
        for ( i = 1 ; i <= q ; i++ )
            print name ( a + i ) >> lelog
    }
' "$srcfile"

【讨论】:

    猜你喜欢
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    相关资源
    最近更新 更多