我花了一段时间才把这句话说得最好。
问题一:
有没有办法在文本文件中查找开头和结尾具有相同字符串的行?
开始和结束字符串不一定彼此相同。
两个字符串之间的文本的字符数或连字符数不一致。
值得注意的字符串之间有一个连字符(我将其添加到我的大文本文件中)。
例如:
文件:
AAAAA-tjhut-ghyut-FILE1.txt
BBB-fhuj-dnbhg-frt76-FILE2.txt
AAAAA-ghtujukr-hgute7gr-xhyutt-FILE1.txt
AAAAA-VGYT-4d7tt-xhyutt-FILE1.txt
CCCC-fjuk-dryy-fhuj-FILE3.txt
要检测的线路:
AAAAA-tjhut-ghyut-FILE1.txt
AAAAA-ghtujukr-hgute7gr-xhyutt-FILE1.txt
AAAAA-VGYT-4d7tt-xhyutt-FILE1.txt
问题2:
有没有办法从上面删除除开头和结尾处包含重复字符串的行之外的所有行?
前:
AAAAA-tjhut-ghyut-FILE1.txt
AAAAA-ghtujukr-hgute7gr-xhyutt-FILE1.txt
AAAAA-VGYT-4d7tt-xhyutt-FILE1.txt
后:
AAAAA-tjhut-ghyut-FILE1.txt
非常感谢您的任何建议。
注意:我认为使用第一个连字符和最后一个连字符的出现可以用来定位重复的字符串。
答案1
问题一: 想法:
- 循环两次
- 在第一个循环提取索引(第 1 列和最后一列)
- 计算索引出现的次数
- 第二个循环再次迭代所有行(存储在第一个循环内)
- 再次从当前行中提取索引
- 如果索引计数 > 1 则打印
这是我的示例,存储为example.awk
:
#!/usr/bin/awk -f
BEGIN {
# field separator
FS="-";
}
{
# remember row for second loop
allRows[rowCount++]=$0;
# relevant columns
colFirst=$1;
colLast=$NF;
# create combined index: first column, space, last column
# count occurences of combined index
indexes[colFirst" "colLast]++;
}
END {
# loop through all input rows
for(currentRow in allRows) {
# extract combined index from current row
arrLen = split(allRows[currentRow],splitted,"-");
colFirst=splitted[1];
colLast=splitted[arrLen];
# output row if index count of current row > 1
if (indexes[colFirst" "colLast] > 1) {
# index count > 1, so print
print allRows[currentRow];
}
}
}
如果输入文件名为input.txt
:
awk -f example.awk < input.txt
我的输出:
AAAAA-tjhut-ghyut-FILE1.txt
AAAAA-ghtujukr-hgute7gr-xhyutt-FILE1.txt
AAAAA-VGYT-4d7tt-xhyutt-FILE1.txt
问题2: 据我了解,您只想保留第一行:
awk -f example.awk < input.txt | head -n 1
head
:输出文件的第一部分
-n 1
:打印前 NUM 行,所以只有 1