我正在使用 Ubuntu bash。我的文件包含文件系统的路径。
例如
C:\users\username\subfolder\thisismyfile.txt
C:\users\username\subfolder\thisismyfileplusadate.txt
C:\users\username\subfolder2\thisismyfileplusname.txt
C:\users\username\subfolder3\thisismyfile.txt
我想做的事:
将每行的每个开头与下一行的开头进行比较。
例如
第 1 行的前 n 个字符,下一行的前 n 个字符。如果这个子字符串相同,我想比较两行的完整长度,并且两行的较长路径应打印到与该较长路径的长度连接的输出文件中。
所以对于我上面的例子:
C:\users\username\subfolder\thisismyfile.txt
C:\users\username\subfolder\thisismyfileplusadate.txt
前 n 个字符,假设为 28,因此将比较“C:\users\username\subfolder\”。它们是相同的。接下来我想比较线条的长度。第 1 行有 44 个字符,第 2 行有 53 个字符。
所以我想将第 1 行打印到输出文件并将“length: 53”连接到字符串(或行的开头)
我该怎么办呢?
答案1
#!/bin/bash
file_len=$(wc -l afile.txt | awk {'print $1'});
let "flen = $file_len-1";
nth=28;
for i in $(seq 1 $flen); do {
li_cut="";
ly_cut="";
let "y = $i +1";
line_i=$(sed -n "$i"p afile.txt);
len_i=$(echo $line_i | wc -m)
li_cut="${line_i:0:$nth}";
line_y=$(sed -n "$y"p afile.txt);
len_y=$(echo $line_y | wc -m)
ly_cut="${line_y:0:$nth}";
if [ "$li_cut" == "$ly_cut" ]; then {
if [ $len_i -gt $len_y ]; then {
echo "$line_i [ $len_i ];"
} fi
if [ $len_y -ge $len_i ]; then {
echo "$line_y [ $len_y ]";
} fi;
} fi;
} done
像这样的东西?对于巨大的文本来说不会那么好,并且可能会以一些更漂亮的形式进行编码。
编辑:最后使用 sort|uniq 可能会很有用,因为:如果第 n+1 > n 行且第 n+1 > n+2 行,你将得到一个“重复”的 n+1
答案2
要沿着该路径的长度打印较长路径的内容:
awk -v n=28 '
substr($0,1,n) == substr(last,1,n) {
if(length($0) > length(last))
printf("length: %d %s\n", length($0), $0);
else
printf("length: %d %s\n", length(last), last);
}
{last = $0}
' file
length: 53 C:\users\username\subfolder\thisismyfileplusadate.txt