この言葉が一番良いと言うのに少し時間がかかりました。
質問1:
テキストファイルで開始と終了の文字列が同じ行を見つける方法はありますか?
開始文字列と終了文字列は必ずしも同じである必要はありません。
2つの文字列間のテキスト内の文字またはハイフンの数が一致しません。
文字列の間にハイフンがあることに注意してください(私はこれを大きなテキストファイルに追加しました)。
たとえば、
文書:
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: アイデア:
- 2回繰り返す
- 最初のループからインデックス(最初と最後の列)を抽出します。
- インデックス発生回数の計算
- 2番目のループはすべての行を再度繰り返します(最初のループ内に保存されます)。
- 現在の行からインデックスを再抽出します。
- インデックス数> 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行だけ印刷されます。