先頭に文字列があり、末尾に文字列を含む行をテキストファイルから削除し、1つを保持します。

先頭に文字列があり、末尾に文字列を含む行をテキストファイルから削除し、1つを保持します。

この言葉が一番良いと言うのに少し時間がかかりました。

質問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行だけ印刷されます。

おすすめ記事