【发布时间】:2020-01-21 01:37:51
【问题描述】:
给定一行输入,其中包含以空格分隔的“n”个参数。输入参数本身是可变的。输入是通过外部文件给出的。
我想根据正则表达式将特定元素移动到变量中。因此,我正在考虑首先声明一个指针变量来跟踪我所在的位置。此外,变量的赋值与数值顺序无关,根据输入的不同,某些变量可能会被完全跳过。
我目前的方法是使用
awk '{print $1}' file.txt
但是,并非所有元素都是固定的,我需要考虑可能不存在或可能有多个条目的元素。
更新:我找到了另一种方法。
file=$(cat /file.txt)
for i in ${file[@]}; do
echo $i >> split.txt;
done
通过这种方式,我们得到的不是带有多个参数的单行,而是带有单个参数的多行。因此,我们现在可以使用var#=(grep --regexp="[pattern]" split.txt。现在我只需要弄清楚如何最好地使用正则表达式来过滤这个烂摊子。
让我举个例子。
我的输入字符串是:
RON KKND 1534Z AUTO 253985G 034SRT 134OVC 04/32
RON KKND 5256Z 143623G72K 034OVC 074OVC 134SRT 145PRT 13/00
RON KKND 2234Z CON 342523G CLS 01/M12 RMK
因此上述每个变量的分配将是:
var1=RON var2=KKND var3=1534Z var4=TRUE var5=FALSE var6=253985G varC=2 varC1=034SRT varC2=134OVC var7=04/32
var1=RON var2=KKND var3=5256Z var4=FALSE var5=FALSE var6=143623G72K varC=4 varC1=034OVC varC2=074OVC varC3=134SRT varC4=145PRT var7=13/00
var1=RON var2=KKND var3=2234Z var4=FALSE var5=TRUE var6=342523G varC=0 var7=01/M12
因此,第四个参数可能是 var4、var5 或 var6。
第五个参数可能是 var5、var6 或匹配其他条件。
第六个参数可能是也可能不是 var6。 var6 和 var7 之间可以通过将每个参数与*/* 匹配来确定
更进一步,var1、var2 和 var3 的输入位置是固定的,但之后我需要比较、排序和分配。此外,参数本身的字符长度可能会有所不同。要划分的每个部分的相对位置相对于其相邻部分是固定的。例如,在输入中 var7 永远不会在 var6 之前,如果 var4 和 var5 为真,则第 4 和第 5 个参数将始终为“AUTO CON” 某些段将始终是一个参数,而其他部分将不止一个。每个人的相对位置是已知的。对于每种模式,有些模式在特定位置具有特定字符,而另一些模式除了在序列中的位置外,可能没有任何标志。
所以我需要 awk 来识别指针变量,因为需要检查每个参数,直到找到特定的匹配项
#Check to see if var4 or var5 exists. if so, flag and increment pointer
pointer=4
if (awk '{print $$pointer}' file.txt) == "AUTO" ; then
var4="TRUE"
pointer=$pointer+1
else
var4="FALSE"
fi
if (awk '{print $$pointer}' file.txt) == "CON" ; then
var5="TRUE"
pointer=$pointer+1
else
var5="FALSE"
fi
#position of var6 is fixed once var4 and var5 are determined
var6=$(awk '{print $$pointer}' file.txt)
pointer=$pointer+1
#Count the arguments between var6 and var7 (there may be up to ten)
#and separate each to decode later. varC[0-9] is always three upcase
# letters followed by three numbers. Use this counter later when decoding.
varC=0
until (awk '{print $$pointer}' file.txt) == "*/*" ; do
varC($varC+1)=(awk '{print $$pointer}' file.txt)
varC=$varC+1
pointer=$pointer+1
done
#position of var7 is fixed after all arguments of varC are handled
var7=$(awk '{print $$pointer}' file.txt)
pointer=$pointer+1
我知道上面的语法不正确。问题是我该如何解决它。
var7 并不总是在输入行的末尾。但是 var7 之后的参数不需要处理。
实际上解释了我还没有理解的模式。我打算使用 case 语句将变量与正则表达式进行比较来处理这个问题。我不想使用 awk 直接解释模式,因为那样会变得非常混乱。我曾考虑使用for n in $string,但这样做意味着直接将每个参数与每个可能的组合进行比较(并且有多个段,每个段都有多个模式),这是不切实际的。我正在尝试将其分为两步。
【问题讨论】:
-
很好尝试,但很抱歉不太清楚,请更清楚地添加示例输出和预期输出示例以及您需要输出的方式(逻辑)。
-
现在应该更清楚了,我希望。
-
据我了解,模式列表应应用于每一列每一行,并且匹配优先级很重要。输入行的顺序和列的内容可能会有很大的变化。请使用示例模式更新以匹配给定的输入。 旁注:使用 awk 是可行的,但工作量很大
-
阅读这篇文章,了解如何在
awk中使用变量stackoverflow.com/questions/19075671/… 这个awk '{print $$pointer}' file.txt是错误的,不会起作用。 -
我尝试了上述方法,但每次命令都将整个输入视为整行,而不是像我试图做的那样将其分开。我知道
awk '{print $$pointer}' file.txt不正确。这就是这里的全部问题,我该如何解决它。