2

Hey Guys ここで助けが必要です。私の目標は、file2 内の file1 の最初の部分を検索または一致させることです。

ファイル1:

\\tempcomputer\c$\test2;test folder;c:\test2
\\tempcomputer\c$\temp;temp folder;C:\temp
\\tempcomputer\c$\unavailablefolder;c:\unavailablefolder

ファイル 2:

\\tempcomputer\c$\test2\;2.777.768 Bytes;11/09/12;11/09/12
\\tempcomputer\c$\temp\;5.400.050.974 Bytes;10/09/12;11/09/12
Error: Invalid property element: \\tempcomputer\c$\unavailablefolder

期待される出力:

\\tempcomputer\c$\test2;test folder;c:\test2;2.777.768 Bytes;11/09/12;11/09/12
\\tempcomputer\c$\temp;temp folder;C:\temp;5.400.050.974 Bytes;10/09/12;11/09/12
\\tempcomputer\c$\unavailablefolder;c:\unavailablefolder;Error: Invalid property element: \\tempcomputer\c$\unavailablefolder

たとえば、file1 の最初の行から比較したいと思います。

\\tempcomputer\c$\test2 

2番目のファイルでそれを検索し、file1から両方のファイルを連結します

\\tempcomputer\c$\test2;test folder;c:\test2 

そしてfile2から

c:\test2;2.777.768 Bytes;11/09/12;11/09/12

したがって、最初の行は次のようになります。

\\tempcomputer\c$\test2;test folder;c:\test2;2.777.768 Bytes;11/09/12;11/09/12

最初の行の期待される結果:

\\tempcomputer\c$\test2;test folder;c:\test2;2.777.768 Bytes;11/09/12;11/09/12 

2 行目の期待される結果:

\\tempcomputer\c$\temp;temp folder;C:\temp;5.400.050.974 Bytes;10/09/12;11/09/12

3 行目の期待される結果:

\\tempcomputer\c$\unavailablefolder;c:\unavailablefolder;Error: Invalid property element: \\tempcomputer\c$\unavailablefolder
4

2 に答える 2

2

File2 のパスの末尾に終端のバックスラッシュがないと仮定すると、次のようになります。

join -t ';' <(sort File1) <(sort File2)

出力します:

\\tempcomputer\c$\temp;temp folder;C:\temp;5.400.050.974 Bytes;10/09/12;11/09/12
\\tempcomputer\c$\test2;test folder;c:\test2;2.777.768 Bytes;11/09/12;11/09/12
于 2012-09-12T04:45:43.733 に答える
2

c00kiemon5terがバックスラッシュ付きのコピー アンド ペースト エラーを示している場合は、 の各行を反復処理するFile2だけFile1です。

シンプルな.awk

BEGIN { FS = OFS = ";" }

{ 
  l=$0
  first=$1
  while(getline < "File2") { 
    if(first == $1) {
      print l, $0
      break
    }
  }
}

実行:

awk -f simple.awk File1

最後にオプションのバックスラッシュを許可するには、もう少し手間がかかりますが、余分な複雑さのほとんどは関数に移動できます。

more-work.awk

function optional_end(s, c) {
  if(c == "")
    c = "\\"
  if(substr(s, length(s)) == c)
    s = substr(s, 1, length(s) - 1)
  return s
}

BEGIN { FS = OFS = ";" }

{ 
  l=$0
  first = optional_end($1)

  while(getline < "File2") {
    if(first == optional_end($1)) {
      print l, $0
      break
    }
  }
}

実行:

awk -f more-work.awk File1

edit by c00kiemon5ter :3

simple.awkを改訂しました。
first-field-line- endings\;で動作し、3 行目も print-joins します。

BEGIN { FS = OFS = ";"; if( file == "") file = "File2" }

{ 
  l=$0
  first=$1
  while(getline < file) { 
    if((idx = index($0, first))) {
      if (idx == 1)
          $1 = l
      else
          $1 = l FS $0
      print
      break
    }
  }
}

編集 2

入力ファイルをオプションとして指定できるようになりました-v file=SOME_FILE。何も指定されていない場合は、「File2」が使用されます。例:

awk -f simple.awk -v file=SOME_FILE File1
于 2012-09-12T03:03:31.440 に答える